美文网首页
02-MongoDB-创建文档和删除文档

02-MongoDB-创建文档和删除文档

作者: 低头看云 | 来源:发表于2020-10-10 10:07 被阅读0次

    创建文档

    1.主键

    MongoDB的主键和MySQL一样, 也是用于保证每一条数据唯一性的

    和MySQL不同的是, MongoDB中的主键无需明确指定

    • 每一个文档被添加到集合之后, MongoDB都会自动添加主键

    • MongoDB中文档主键的名称叫做 _id

    默认情况下文档主键是一个ObjectId类型的数据

    • ObjectId类型是一个12个字节字符串(5e8c5ae9-c9d35e-759b-d6847d)

    • 4字节是存储这条数据的时间戳

    • 3字节的存储这条数据的那台电脑的标识符

    • 2字节的存储这条数据的MongoDB进程id

    • 3字节是计数器

    2.1为什么要使用ObjectId类型数据作为主键?

    因为MongoDB是支持'横向扩展'的数据库

    • 横向扩展是指'增加数据库服务器的台数

    • 纵向扩展是指'增加数据库库服务器的配置'

    过去一个数据库只能安装在一台电脑上, 但是每台电脑的性能是有峰值的一旦达到峰值就会导致服务器卡顿、宕机、重启等问题.

    所以过去为了防止如上问题的出现,我们只能不断的'纵向扩展'

    也就是不断的提升服务器的配置, 让服务器能处理更多的请求

    但是纵向扩展也是有峰值的, 一台电脑的配置不可能无限提升

    所以为了解决这个问题就有了分布式数据库

    分布式数据库是指可以在多台电脑上安装数据库, 然后把多台电脑组合成一个完整的数据库,

    在分布式数据库中,我们可以通过不断同步的方式, 让多台电脑都保存相同的内容

    当用户请求数据时, 我们可以把请求派发给不同的数据库服务器处理

    当某一台服务器宕机后, 我们还可以继续使用其它服务器处理请求

    从而有效的解决了单台电脑性能峰值和单台电脑宕机后服务器不能使用的问题

    2.2为什么要使用ObjectId类型数据作为主键?

    正是因为MongoDB是一个分布式数据库, 正是因为分布式数据库可以把请求派发给不同的服务器

    所以第一次插入数据时, 我们可能派发给了A服务器, 插入到了A服务器的数据库中

    但是第二次插入数据时, 我们又可能派发给了B服务器, 插入到了B服务器的数据库中

    但是B服务器此时并不知道A服务器当前的主键值是多少, 如果通过MySQL中简单的递增来保证数据的唯一性

    那么将来在多台服务器同步数据的时候就会出现重复的情况, 所以MongoDB的主键并没有使用简单的递增

    而是使用了ObjectId类型数据作为主键

    3.是否支持其它类型数据作为主键?

    3.1在MongoDB中支持除了'数组类型'以外的其它类型数据作为主键

    3.2在MongoDB中甚至还支持将一个文档作为另一个文档的主键(复合主键)

    db.person.insert({name: 'css', age: 33});
    db.person.insert({_id: 1, name: 'css', age: 33});
    #db.person.insert({_id: 1, name: 'csss', age: 33}); #报错
    db.person.insert({_id: '1', name: 'css', age: 33});
    db.person.insert({_id: {name:'js', gender: '男'}, name: 'css', age: 33});
    #db.person.insert({_id: {name:'js', gender: '男'}, name: 'css', age: 33}); #报错
    db.person.insert({_id: {gender: '男', name:'js'}, name: 'css', age: 33});
    

    写入文档

    1.写入一个文档

    db.<collection>.insertOne(
    
        <document>,
        {
            writeConcern: <document>
        }
    
    );
    
    document: 需要写入的文档
    
    writeConcern: 写入安全级别
    

    2.安全级别

    用于判断数据是否写入成功,

    安全级别越高, 丢失数据风险越小, 但是性能消耗(操作延迟)也就越大

    默认情况下MongoDB会开启默认的安全些级别,先不用关心

    3.注意点

    在使用insertXXX写入文档时, 如果调用insertOne的集合不存在会自动创建

    db.person.insertOne({name:'zs', age:18}) 
    db.person.find() 
    db.student.insertOne({name:'zs', age:18}) #集合不存在会自动创建 db.student.find()
    

    4.其它方式

    db.<collection>.save(

    ​ <document>,

    ​ {

    ​ writeConcern: <document>

    ​ }

    );

    db.person.save({name:'ls', age:19})
    db.person.find()
    db.teacher.save({name:'ls', age:19}) #集合不存在会自动创建
    db.teacher.find()
    

    5.insertOne和save不同

    主键冲突时insertOne会报错,而save会直接用新值覆盖久值

    db.person.insertOne({_id:1, name:'ww', age:22})
    db.person.find()
    db.person.insertOne({_id:1, name:'ww', age:22}) #报错
    db.person.save({_id:1, name:'zs', age:66}) #用新数据替换久数据
    db.person.find()
    

    6.写入多个文档

    db.<collection>.insertMany(

    ​ [<document>, ...],

    ​ {

    ​ writeConcern: <document>,

    ​ ordered: <boolean>

    ​ }

    );

    ordered: 是否按顺序写入

    ordered默认取值是true, 也就是会严格按照顺序写入

    如果ordered是false, 则不会按照顺序写入, 但写入效率更高(系统会自动优化)

    db.person.insertMany(
    [{name:'zs', age:18},{name:'ls', age:19},{name:'ww', age:20}],
    {}
    )
    db.person.find()
    

    注意点:

    如果ordered是true, 前面的文档出错, 后面的所有文档都不会被写入

    如果ordered是false, 前面的文档出错, 后面的所有文档也会被写入

    
    db.person.insertMany(
    [{_id:1, name:'zs', age:18},{_id:1, name:'ls', age:19},{_id:2, name:'ww', age:20}],
    { ordered: true }
    )
    // 如果ordered:true, _id相同,那么后面数据不会插入
    db.person.find()
    
    db.person.remove({})
    
    db.person.insertMany(
    [{_id:1, name:'zs', age:18},{_id:1, name:'ls', age:19},{_id:2, name:'ww', age:20}],
    { ordered: false }
    )
    // 如果 order:false, _id相同, 后面的数据也会被插入
    db.person.find()
    

    7.Insert写入一个或多个文档

    db.<collection>.insert(

    ​ <document> or ,[<document>, ...]

    ​ {

    ​ writeConcern: <document>,

    ​ ordered: <boolean>

    ​ }

    );

    insertOne和insertMany结合体

    2.注意点:

    和insertOne/insertMany一样, 集合不存在会自动创建

    和insertOne/insertMany一样, 主键冲突会报错

    和insertMany一样, 默认都是按顺序插入, 前面的文档出错, 后续所有文档不会被插入

    删除文档

    1.删除文档

    db.<collection>.remove(<query>, <options>)

    <query>: 删除筛选条件

    <options>: 删除额外配置

    2.示例

    db.person.insert([
    {name:'zs', age:18},
    {name:'zs', age:19},
    {name:'ls', age:20},
    {name:'ls', age:21},
    {name:'ww', age:22},
    {name:'zl', age:23},
    ])
    
    
    //2.1删除所有满足条件
    // 注意点: 和update方法不同, remove方法默认就会删除所有满足条件的数据
    db.person.remove({name:'zs'})
    //2.2删除第一个满足条件
    db.person.remove({name:'ls'},{justOne:true})
    //2.3删除所有文档
    db.person.remove({})
    

    相关文章

      网友评论

          本文标题:02-MongoDB-创建文档和删除文档

          本文链接:https://www.haomeiwen.com/subject/opelpktx.html