1. 程式人生 > >MongoDB增刪改查(三)

MongoDB增刪改查(三)

Insert Documents

插入單個document到collection中.

db.inventory.insertOne(
 { item: “canvas”, qty: 100, tags: [“cotton”], size: { h: 28, w: 35.5, uom: “cm” } }
)

插入多個document到collection中

db.inventory.insertMany([
 { item: “journal”, qty: 25, tags: [“blank”, “red”], size: { h: 14, w: 21, uom: “cm” } },
 { item: “mat”, qty: 85, tags: [“gray”], size: { h: 27.9, w: 35.5, uom: “cm” } },
  { item: “mousepad”, qty: 25, tags: [“gel”, “blue”], size: { h: 19, w: 22.85, uom: “cm” } }
])

Query Documents

查詢collection中所有的document

db.inventory.find({})

等同如下sql語句

select* from inventory

查詢inventory中status為D的document

db.inventory.find({status:”D”})

等同如下sql語句

select * from inventory where status = “D”

查詢集合中的文件,$in,$nin與$in相反

db.inventory.find({status:{$in:[“A”,”D”]}})

等同如下sql語句

select * from inventory where status in (“A”, “D”)

查詢集合中status等於“A”並且qty小於30的記錄

db.inventory.find( { status: “A”, qty: { $lt: 30 } } )

等同如下sql語句

select * from inventory where status = “A” and qty < 30

查詢集合中status等於“A” 或者 qty小於30的記錄

db.inventory.find( { $or: [ { status: “A” }, { qty: { $

lt: 30 } } ] } )

等同如下sql語句

select * from inventory where status = “A” or qty < 30

查詢集合中status等於“A” 並且 qty小於30或itme以“p”開頭的的記錄

db.inventory.find ( {status:”A”, $or:[ {qty:{$lt:30}}, {item:/^p/}]} )

等同如下sql語句

select * from inventory where status = “A” and (qty < 30 or item like “p%”

Project Fields to Return from Query

使用inventory,並插入資料

db.inventory.insertMany( [
{ item: “journal”, status: “A”, size: { h: 14, w: 21, uom: “cm” }, instock: [ { warehouse: “A”, qty: 5 } ] },
{ item: “notebook”, status: “A”, size: { h: 8.5, w: 11, uom: “in” }, instock: [ { warehouse: “C”, qty: 5 } ] },
{ item: “paper”, status: “D”, size: { h: 8.5, w: 11, uom: “in” }, instock: [ { warehouse: “A”, qty: 60 } ] },
{ item: “planner”, status: “D”, size: { h: 22.85, w: 30, uom: “cm” }, instock: [ { warehouse: “A”, qty: 40 } ] },
{ item: “postcard”, status: “A”, size: { h: 10, w: 15.25, uom: “cm” }, instock: [ { warehouse: “B”, qty: 15 }, { warehouse: “C”, qty: 35 } ] }
]);

查詢結果中只包含特定欄位,如status,itme和_id

db.inventory.find({status:”A”}, {status:1,item:1})

等同如下sql語句

select _id, item, status from inventory where status = “A”

查詢結果

{ “_id” : ObjectId(“59463980d563a479ea806948”), “item” : “journal”, “status” : “A” }
{ “_id” : ObjectId(“59463980d563a479ea806949”), “item” : “notebook”, “status” :”A” }
{ “_id” : ObjectId(“59463980d563a479ea80694c”), “item” : “postcard”, “status” :”A” }

從查詢結果中刪除_id欄位,如果你不想返回某欄位,在projection中設定為0

db.inventory.find({status:”A”}, {status:1,item:1,_id:0})

等同如下sql語句

select item, status from inventory where status = “A”

查詢結果

{ “item” : “journal”, “status” : “A” }
{ “item” : “notebook”, “status” : “A” }
{ “item” : “postcard”, “status” : “A” }

返回所有欄位,除了移除的

db.inventory.find( { status: “A” }, { status: 0, instock: 0 } )

除了_id欄位例外,不能把包含和不包含混用,下面使用是錯誤的

db.inventory.find( { status: “A” }, { status: 0, instock: 1} )

會報如下錯誤

Error: error: {
        "waitedMS" : NumberLong(0),
        "ok" : 0,
        "errmsg" : "Projection cannot have a mix of inclusion and exclusion.",
        "code" : 2
}

返回巢狀文件中的特定欄位

返回_id,item,status以及在size文件中的uom欄位

db.inventory.find({status:”A”}, {status:1,item:1,”size.uom”: 1})

Query an Array

插入資料

db.inventory.insertMany([
{ item: “journal”, qty: 25, tags: [“blank”, “red”], dim_cm: [ 14, 21 ] },
{ item: “notebook”, qty: 50, tags: [“red”, “blank”], dim_cm: [ 14, 21 ] },
{ item: “paper”, qty: 100, tags: [“red”, “blank”, “plain”], dim_cm: [ 14, 21 ] },
{ item: “planner”, qty: 75, tags: [“blank”, “red”], dim_cm: [ 22.85, 30 ] },
{ item: “postcard”, qty: 45, tags: [“blue”], dim_cm: [ 10, 15.25 ] }
]);

查詢tags的值為“red”和“blank”的所有文件,”red”和“blank”是有順序

db.inventory.find( { tags: [“red”, “blank”] } )

查詢結果

{ “_id” : ObjectId(“594a229285510604aedcdacb”), “item” : “notebook”, “qty” : 50,
“tags” : [ “red”, “blank” ], “dim_cm” : [ 14, 21 ] }

查詢tags的值為“red”和“blank”的所有文件,”red”和“blank”是沒有順序的,用$all操作符

db.inventory.find({tags:{$all:[“red”,”blank”]}})

查詢結果

{ “_id” : ObjectId(“5945f58ed563a479ea806942”), “item” : “journal”, “qty” : 25,
“tags” : [ “blank”, “red” ], “size” : { “h” : 14, “w” : 21, “uom” : “cm” } }
{ “_id” : ObjectId(“594a229285510604aedcdaca”), “item” : “journal”, “qty” : 25,
“tags” : [ “blank”, “red” ], “dim_cm” : [ 14, 21 ] }
{ “_id” : ObjectId(“594a229285510604aedcdacb”), “item” : “notebook”, “qty” : 50,
“tags” : [ “red”, “blank” ], “dim_cm” : [ 14, 21 ] }
{ “_id” : ObjectId(“594a229285510604aedcdacc”), “item” : “paper”, “qty” : 100, ”
tags” : [ “red”, “blank”, “plain” ], “dim_cm” : [ 14, 21 ] }
{ “_id” : ObjectId(“594a229285510604aedcdacd”), “item” : “planner”, “qty” : 75,
“tags” : [ “blank”, “red” ], “dim_cm” : [ 22.85, 30 ] }

dim_cm至少包含一個元素,其中一個元素大於15,另一個元素小於20.或者只有一個元素,滿足兩個條件

db.inventory.find({dim_cm:{gt:15,lt:20}})

查詢結果

{ “_id” : ObjectId(“594a229285510604aedcdaca”), “item” : “journal”, “qty” : 25,
“tags” : [ “blank”, “red” ], “dim_cm” : [ 14, 21 ] }
{ “_id” : ObjectId(“594a229285510604aedcdacb”), “item” : “notebook”, “qty” : 50,
“tags” : [ “red”, “blank” ], “dim_cm” : [ 14, 21 ] }
{ “_id” : ObjectId(“594a229285510604aedcdacc”), “item” : “paper”, “qty” : 100, ”
tags” : [ “red”, “blank”, “plain” ], “dim_cm” : [ 14, 21 ] }
{ “_id” : ObjectId(“594a229285510604aedcdace”), “item” : “postcard”, “qty” : 45,
“tags” : [ “blue” ], “dim_cm” : [ 10, 15.25 ] }

用$elemMatch規定陣列至少包含一個元素,滿足所有的限制條件。dim_cm中至少包含一個元素,滿足條件大於22且小於30

db.inventory.find({dim_cm:{elemMatch:{gt:22,$lt:30}}})

查詢結果

{ “_id” : ObjectId(“594a229285510604aedcdacd”), “item” : “planner”, “qty” : 75,
“tags” : [ “blank”, “red” ], “dim_cm” : [ 22.85, 30 ] }

db.inventory.find( { “dim_cm.1”: { $gt: 25 } } )

用.來指定陣列中某個位置上的元素
db.inventory.find({“dim_cm.1”:{$gt:25}})

查詢結果

{ “_id” : ObjectId(“594a229285510604aedcdacd”), “item” : “planner”, “qty” : 75,
“tags” : [ “blank”, “red” ], “dim_cm” : [ 22.85, 30 ] }

Query for null or mising fileds

插入資料

db.inventory.insertMany([
 { _id: 1, item: null },
 { _id: 2 }
])

{ item : null } 返回item的值為null或者不包含item的文件

db.inventory.find({item:null})

查詢結果

{ “_id” : 1, “item” : null }
{ “_id” : 2 }

{ item: {$type:10} }條件返回僅僅包含item:null的文件

db.inventory.find( {item:{$type:10}} )

查詢結果

{ “_id” : 1, “item” : null }

{ item : { $exists: false } }查詢條件匹配不包含item的文件

db.inventory.find({item:{$exists:false}})

查詢結果

{ “_id” : 2 }

Update Documents

mongo shell提供了下面三種更新document的操作

  • db.collection.updateOne(< filter >, < update >, < options >)
  • db.collection.updateMany(< filter >, < update >, < options >)
  • db.collection.replaceOne(< filter >, < replacement >, < options >)

插入資料

db.inventory.insertMany( [
   { item: "canvas", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" },
   { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "mat", qty: 85, size: { h: 27.9, w: 35.5, uom: "cm" }, status: "A" },
   { item: "mousepad", qty: 25, size: { h: 19, w: 22.85, uom: "cm" }, status: "P" },
   { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
   { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
   { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
   { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
   { item: "sketchbook", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "sketch pad", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" }
]);

Update a Single Document

更新inventory集合中item值為paper的第一個document

db.inventory.updateOne(
   { item: "paper" },
   {
     $set: { "size.uom": "cm", status: "P" },
     $currentDate: { lastModified: true }
   }
)
  • 使用$set操作符更新size.uom欄位值為“cm”,status值更新為“P”

  • 使用$currentDate操作符更新lastModified欄位為當前時間。如果lastModified欄位不存在,就會建立這個欄位。

Update Multiple Documents

更新所有qty小於等於50的document

db.inventory.updateMany(
   { "qty": { $lt: 50 } },
   {
     $set: { "size.uom": "in", status: "P" },
     $currentDate: { lastModified: true }
   }
)

Replace a Document

  為了替換文件中除_id以外的所有內容,需要在db.collection.replaceOne()的第二個引數中傳入一個新的document。

db.inventory.replaceOne(
   { item: "paper" },
   { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] }
)

Delete Documents

插入資料

db.inventory.insertMany( [
   { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
   { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
   { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
   { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
]);

刪除所有status為”A”的document

db.inventory.deleteMany({ status : "A" })

刪除status為”D”的第一個document

db.inventory.deleteOne( { status: "D" } )