zoukankan      html  css  js  c++  java
  • 【三】MongoDB文档的CURD操作

    一、插入文档

    使用insert方法插入文档到一个集合中,如果集合不存在创建集合,有以下几种方法:

    • db.collection.insertOne({}):(v3.2 new)  #插入一个文档到集合中
    > db.users.insertOne(
    ... {
    ...    name:"Marry",
    ...    age:26,
    ...    status:"pending"
    ... }
    ... )
    {
        "acknowledged" : true,
        "insertedId" : ObjectId("565d23db556b61b96bdb1b20")
    }
    • db.collection.insertMany([{},{}...]) (v3.2 new) #插入多个文档
    > db.users.insertMany(
    ... [
    ...   {name:"Sue",age:25,status:"pending"},
    ...   {name:"bob",age:24,status:"enrolled"},
    ...   {name:"ann",age:28,status:"enrolled"}
    ... ]
    ... )
    {
        "acknowledged" : true,
        "insertedIds" : [
            ObjectId("565d2d75556b61b96bdb1b21"),
            ObjectId("565d2d75556b61b96bdb1b22"),
            ObjectId("565d2d75556b61b96bdb1b23")
        ]
    }
    • insert()  #既能插入一个文档,也可以插入多个文档
    > post={"title":"My First blog","author":"Darren","content":"this is my first blog"}
    {
        "title" : "My First blog",
        "author" : "Darren",
        "content" : "this is my first blog"
    }
    > db.posts.insert(post)
    WriteResult({ "nInserted" : 1 })
    > db.users.insert(
    ... [
    ...   {name:"test1",age:20,status:"pending"},
    ...   {name:"test2",age:21,status:"enrolled"}
    ... ]
    ... )
    BulkWriteResult({
        "writeErrors" : [ ],
        "writeConcernErrors" : [ ],
        "nInserted" : 2,
        "nUpserted" : 0,
        "nMatched" : 0,
        "nModified" : 0,
        "nRemoved" : 0,
        "upserted" : [ ]
    })

    二、查询文档

    1、db.collection.find(query,projection)

    参数说明: 

         参数                         类型                        描述

        query                       document                  可选,返回指定条件的文档,如果查询所有文档,({})

        projection                 document                   可选,返回指定的字段,1表示true,0表示false

    其中在query参数中,可以指定操作符,如大于,小于等等。

    { <field>: { $eq: <value> } }

    例子说明:

    • 查询集合中全部文档
    > db.a.find({})
    • 查询符合条件的文档,如_id=5的文档
    > db.a.find({_id:5})
    { "_id" : 5, "name" : { "first" : "Ole-Johan", "last" : "Dahl" }, "birth" : ISODate("1931-10-12T04:00:00Z"), "death" : ISODate("2002-06-29T04:00:00Z"), "contribs" : [ "OOP", "Simula" ], "awards" : [ { "award" : "Rosing Prize", "year" : 1999, "by" : "Norwegian Data Association" }, { "award" : "Turing Award", "year" : 2001, "by" : "ACM" }, { "award" : "IEEE John von Neumann Medal", "year" : 2001, "by" : "IEEE" } ] }
    > db.a.find({_id:{$eq:5}})     #通过操作符的方式
    { "_id" : 5, "name" : { "first" : "Ole-Johan", "last" : "Dahl" }, "birth" : ISODate("1931-10-12T04:00:00Z"), "death" : ISODate("2002-06-29T04:00:00Z"), "contribs" : [ "OOP", "Simula" ], "awards" : [ { "award" : "Rosing Prize", "year" : 1999, "by" : "Norwegian Data Association" }, { "award" : "Turing Award", "year" : 2001, "by" : "ACM" }, { "award" : "IEEE John von Neumann Medal", "year" : 2001, "by" : "IEEE" } ] }
    • 查询文档并返回指定字段
    > db.a.find({_id:{$eq:5}},{name:1,first:1,last:1}) #返回name,first,last三个字段,默认返回_id
    { "_id" : 5, "name" : { "first" : "Ole-Johan", "last" : "Dahl" } }
    > db.a.find({_id:{$eq:5}},{name:1,first:1,last:1,_id:0}) #指定_id不显示
    { "name" : { "first" : "Ole-Johan", "last" : "Dahl" } }
    • 范围查询
    #查询_id大于1,小于3的文档  
    > db.a.find({_id:{$gt:1,$lt:5}},{name:1,first:1,last:1})
    { "_id" : 3, "name" : { "first" : "Grace", "last" : "Hopper" } }
    { "_id" : 4, "name" : { "first" : "Kristen", "last" : "Nygaard" } }
          

    查询条件和操作符还有很多内容,具体请参考官方文档。

    三、更新文档

     mongodb提供以下几种方法对文档进行更新:

    • db.collection.updateOne(filter,update,options)  更新一个文档

    参数                               类型                            说明

    filter                               document                     同查询一样,当{}为空时,只更新集合的第一个文档

    update                            document                     更新内容,可以用更新操作符,如$set,$unset,$rename

    upsert                             boolean                        可选,当为true时,如果没有找到更新的文档,那么就插入新的文档

    例子:

    > db.a.updateOne(
    ... {_id :5},
    ... {$set :{year:2000}}   #$set操作符表示更新字段的值
    ... )
    { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
    
    > db.a.find({_id:5},{year:1})
    { "_id" : 5, "year" : 2000 }
    • db.collection.updateMany()
    > db.a.updateMany(
    ... {_id :{$lt:5}},
    ... {$set:{year:1999}}
    ... )
    { "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
    
    > db.a.find({_id:{$lt:5}},{year:1})
    { "_id" : 1, "year" : 1999 }
    { "_id" : 3, "year" : 1999 }
    { "_id" : 4, "year" : 1999 }
    • db.collection.replaceOne():不需要原字段和现字段一样多,可以任意替代。
    > db.a.replaceOne(
    ... {_id:5},
    ... {name:"darren",address:"1022",year:1988}
    ... )
    { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
    > db.a.find({_id:5})
    { "_id" : 5, "name" : "darren", "address" : "1022", "year" : 1988 }
    • db.collection.update():可以更新一个或多个文档,当然还可以替代一个文档
    db.users.update(
       { age: { $gt: 18 } },
       { $set: { status: "A" } },
       { multi: true }
    )

    四、删除文档

    db.xxx.remove({}):删除xxx集合中所有文档,但不会删除集合本身和索引,remove必须带上过滤参数,空的{}表示删除所有。

    注意:删除数据是永久性的,不能恢复,不能撤销。

    当集合中数据库量非常大时,用remove删除有时很慢,drop()可以提供很好的速度,但是会把集合及索引全部删除。

     除了remove方法,新版本提供以下方法进行删除:

    • db.collection.deleteOne()

    可以带有过滤参数,删除匹配文档的第一个,如果不加任何过滤条件,则删除文档第一个。

    db.users.deleteOne(
       { status: "reject" }
    )
    • db.collection.deleteMany()
    db.users.deleteMany(
       { status: "reject" }
    )

    另外mongodb还提供一个大杀器,可以把insert,update,delete放到一起批量执行:

    db.collection.bulkWrite()

    db.collection.bulkWrite(
       [
          { insertOne : { "document" : { name : "sue", age : 26 } } },
          { insertOne : { "document" : { name : "joe", age : 24 } } },
          { insertOne : { "document" : { name : "ann", age : 25 } } },
          { insertOne : { "document" : { name : "bob", age : 27 } } },
          { updateMany: {
             "filter" : { age : { $gt : 25} },
             "update" : { $set : { "status" : "enrolled" } }
             }
          },
          { deleteMany : { "filter" : { "status" : { $exists : true } } } }
       ]
    )
  • 相关阅读:
    C#扩展方法学习
    如何用PS快速做出3D按钮效果的图片
    比较C#中几种常见的复制字节数组方法的效率[转]
    GUID的学习
    委托与事件的区别
    利用Marshal.AllocHGlobal申请非托管内存,unsafe代码
    JAVASE(十三) 异常处理
    JAVASE(十二) Java常用类: 包装类、String类、StringBuffer类、时间日期API、其他类
    JAVASE(十一) 高级类特性: abstract 、模板模式、interface、内部类、枚举、注解
    面试题: SpringBoot 的自启动原理
  • 原文地址:https://www.cnblogs.com/mysql-dba/p/5039972.html
Copyright © 2011-2022 走看看