1. 程式人生 > >【三】MongoDB文檔的CURD操作

【三】MongoDB文檔的CURD操作

其中 iat options match imu 可選 不能 dal 多個

一、插入文檔

使用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 } } } }
   ]
)
技術分享

【三】MongoDB文檔的CURD操作