《MongoDB高手課》學習記錄(第十天)

踩坑記錄

多是以前的理解有問題,昨天看了一下官方文檔,經過brew是能夠直接安安裝MongoDB Community的最新版本的。固然企業版本是沒啥辦法,還得下載壓縮包,而後本身配置。git

安裝過程

須要的環境

  1. 4.2 版本的MongoDB只支持 10.12 版本以上的MacOS。
  2. 須要安裝 xcode
  3. 固然還須要安裝 Homebrew
  4. 須要安裝 gcc
  5. 文檔地址

安裝過程

# 首先註冊 MongoDB Homebrew Tap
$> brew tap mongodb/brew

# 如今我能查到的版本以下
$> brew search mongodb-community

==> Formulae
mongodb/brew/mongodb-community                           mongodb/brew/mongodb-community@3.2                       mongodb/brew/mongodb-community@3.6
mongodb/brew/mongodb-community-shell                     mongodb/brew/mongodb-community@3.4                       mongodb/brew/mongodb-community@4.0

# 默認沒有打Tag的版本是4.2.2
$> brew info mongodb-community

mongodb/brew/mongodb-community: stable 4.2.2
High-performance, schema-free, document-oriented database
https://www.mongodb.com/
Not installed
From: https://github.com/mongodb/homebrew-brew/blob/master/Formula/mongodb-community.rb
==> Caveats
To have launchd start mongodb/brew/mongodb-community now and restart at login:
  brew services start mongodb/brew/mongodb-community
Or, if you don't want/need a background service you can just run:
  mongod --config /usr/local/etc/mongod.conf
  
# 開始安裝
$> brew install mongodb-community

==> Caveats
To have launchd start mongodb/brew/mongodb-community now and restart at login:
  brew services start mongodb/brew/mongodb-community
Or, if you don't want/need a background service you can just run:
  mongod --config /usr/local/etc/mongod.conf
==> Summary
🍺  /usr/local/Cellar/mongodb-community/4.2.2: 21 files, 274.5MB, built in 27 minutes 20 seconds

# 啓動服務
$> brew services start mongodb/brew/mongodb-community

==> Successfully started `mongodb-community` (label: homebrew.mxcl.mongodb-community)

安裝位置信息

  • 程序目錄:/usr/local/Cellar/mongodb-community
  • 配置文件:/usr/local/etc/mongod.conf
  • 系統日誌:/usr/local/var/log/mongodb
  • 數據目錄:/usr/local/var/mongodb

第十天

今日複習內容爲CRUD操做,直接在Shell操做。都是官網的例子哈。
地址在這裏:參考文檔github

準備練手數據

> 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: "A" },
...    { 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" }
... ]);
{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("5e06f1f5c01e4d7f78f96cc9"),
        ObjectId("5e06f1f5c01e4d7f78f96cca"),
        ObjectId("5e06f1f5c01e4d7f78f96ccb"),
        ObjectId("5e06f1f5c01e4d7f78f96ccc"),
        ObjectId("5e06f1f5c01e4d7f78f96ccd")
    ]
}

查詢操做

查詢全部記錄

select * from inventory正則表達式

> db.inventory.find( {} )
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96cc9"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96cca"), "item" : "notebook", "qty" : 50, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "A" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccb"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "D" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccc"), "item" : "planner", "qty" : 75, "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "status" : "D" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccd"), "item" : "postcard", "qty" : 45, "size" : { "h" : 10, "w" : 15.25, "uom" : "cm" }, "status" : "A" }
> db.inventory.find()
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96cc9"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96cca"), "item" : "notebook", "qty" : 50, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "A" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccb"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "D" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccc"), "item" : "planner", "qty" : 75, "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "status" : "D" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccd"), "item" : "postcard", "qty" : 45, "size" : { "h" : 10, "w" : 15.25, "uom" : "cm" }, "status" : "A" }

我發現,傳不傳 {} 空對象,結果都同樣哈。mongodb

指定查詢條件

SELECT * FROM inventory WHERE status = "D"
對應的MQL以下shell

> db.inventory.find({"status": "D"})
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccb"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "D" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccc"), "item" : "planner", "qty" : 75, "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "status" : "D" }

SELECT * FROM inventory WHERE status in ("A", "D")
對應的MQL以下:數組

> db.inventory.find({status: {$in:["A","D"]}})
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96cc9"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96cca"), "item" : "notebook", "qty" : 50, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "A" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccb"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "D" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccc"), "item" : "planner", "qty" : 75, "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "status" : "D" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccd"), "item" : "postcard", "qty" : 45, "size" : { "h" : 10, "w" : 15.25, "uom" : "cm" }, "status" : "A" }

SELECT * FROM inventory WHERE status = "A" AND qty < 30
對應的MQL以下xcode

> db.inventory.find({status:"A", qty:{$lt:30}})
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96cc9"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
>> db.inventory.find({$and:[{status:"A"},{qty:{$lt:30}}]})
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96cc9"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }

SELECT * FROM inventory WHERE status = "A" OR qty < 80
對應的MQL以下post

> db.inventory.find({$or:[{status: "A"},{qty:{$lt: 80}}]})
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96cc9"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96cca"), "item" : "notebook", "qty" : 50, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "A" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccc"), "item" : "planner", "qty" : 75, "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "status" : "D" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccd"), "item" : "postcard", "qty" : 45, "size" : { "h" : 10, "w" : 15.25, "uom" : "cm" }, "status" : "A" }

SELECT * FROM inventory WHERE status = "A" AND ( qty < 30 OR item LIKE "p%")
對應的MQL以下(這裏面用到了正則表達式)ui

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

{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96cc9"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccd"), "item" : "postcard", "qty" : 45, "size" : { "h" : 10, "w" : 15.25, "uom" : "cm" }, "status" : "A" }

> db.inventory.find({$and:[{status: "A"},{$or:[{qty:{$lt: 30}},{item:{$regex:/^p/}}]}]})
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96cc9"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccd"), "item" : "postcard", "qty" : 45, "size" : { "h" : 10, "w" : 15.25, "uom" : "cm" }, "status" : "A" }

查詢內嵌對象

好比我要查詢到這條記錄rest

{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96cc9"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }

我要這麼寫,也就是寫上完整的條件

> db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96cc9"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }

換個順序也不行,必須按順序寫

> db.inventory.find( { size: { w:21, h: 14, uom: "cm" } } )

少寫個字段不行

> db.inventory.find( { size: { h: 14, w: 21} } )

坑爹,那怎麼搞
這樣,有了,「.」 操做符

> db.inventory.find({"size.w":21})
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96cc9"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
>

加個條件

> db.inventory.find({"size.h":{$lte:10}})
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96cca"), "item" : "notebook", "qty" : 50, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "A" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccb"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "D" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccd"), "item" : "postcard", "qty" : 45, "size" : { "h" : 10, "w" : 15.25, "uom" : "cm" }, "status" : "A" }

再寫複雜點

> db.inventory.find({"size.h":{$lte:10},"size.w":11,status:"A"})
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96cca"), "item" : "notebook", "qty" : 50, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "A" }

數組查詢

> 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 ] }
... ]);
{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("5e070270c01e4d7f78f96cce"),
        ObjectId("5e070270c01e4d7f78f96ccf"),
        ObjectId("5e070270c01e4d7f78f96cd0"),
        ObjectId("5e070270c01e4d7f78f96cd1"),
        ObjectId("5e070270c01e4d7f78f96cd2")
    ]
}
> db.inventory.find()
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96cc9"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96cca"), "item" : "notebook", "qty" : 50, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "A" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccb"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "D" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccc"), "item" : "planner", "qty" : 75, "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "status" : "D" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccd"), "item" : "postcard", "qty" : 45, "size" : { "h" : 10, "w" : 15.25, "uom" : "cm" }, "status" : "A" }
{ "_id" : ObjectId("5e070270c01e4d7f78f96cce"), "item" : "journal", "qty" : 25, "tags" : [ "blank", "red" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("5e070270c01e4d7f78f96ccf"), "item" : "notebook", "qty" : 50, "tags" : [ "red", "blank" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("5e070270c01e4d7f78f96cd0"), "item" : "paper", "qty" : 100, "tags" : [ "red", "blank", "plain" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("5e070270c01e4d7f78f96cd1"), "item" : "planner", "qty" : 75, "tags" : [ "blank", "red" ], "dim_cm" : [ 22.85, 30 ] }
{ "_id" : ObjectId("5e070270c01e4d7f78f96cd2"), "item" : "postcard", "qty" : 45, "tags" : [ "blue" ], "dim_cm" : [ 10, 15.25 ] }

和文檔中對象的查詢同樣的問題,要查一個數據,常規的寫法,必須保證寫全元素,包括順序也得同樣。

> db.inventory.find({tags:["blank","red"]})
{ "_id" : ObjectId("5e070270c01e4d7f78f96cce"), "item" : "journal", "qty" : 25, "tags" : [ "blank", "red" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("5e070270c01e4d7f78f96cd1"), "item" : "planner", "qty" : 75, "tags" : [ "blank", "red" ], "dim_cm" : [ 22.85, 30 ] }

不寫全了,查不到

> db.inventory.find({tags:["blank"]})

若是隻想查詢包括 blank 的數據,得這麼寫

> db.inventory.find({tags:"blank"})
{ "_id" : ObjectId("5e070270c01e4d7f78f96cce"), "item" : "journal", "qty" : 25, "tags" : [ "blank", "red" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("5e070270c01e4d7f78f96ccf"), "item" : "notebook", "qty" : 50, "tags" : [ "red", "blank" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("5e070270c01e4d7f78f96cd0"), "item" : "paper", "qty" : 100, "tags" : [ "red", "blank", "plain" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("5e070270c01e4d7f78f96cd1"), "item" : "planner", "qty" : 75, "tags" : [ "blank", "red" ], "dim_cm" : [ 22.85, 30 ] }

順序不同,查不全數據

> db.inventory.find({tags:["red", "blank"]})
{ "_id" : ObjectId("5e070270c01e4d7f78f96ccf"), "item" : "notebook", "qty" : 50, "tags" : [ "red", "blank" ], "dim_cm" : [ 14, 21 ] }
>

那怎麼辦,我就想查詢包括 blank 和 red 的都行的數據,與順序無關的。這樣,加個 $all

> db.inventory.find({tags:{$all:["red", "blank"]}})
{ "_id" : ObjectId("5e070270c01e4d7f78f96cce"), "item" : "journal", "qty" : 25, "tags" : [ "blank", "red" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("5e070270c01e4d7f78f96ccf"), "item" : "notebook", "qty" : 50, "tags" : [ "red", "blank" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("5e070270c01e4d7f78f96cd0"), "item" : "paper", "qty" : 100, "tags" : [ "red", "blank", "plain" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("5e070270c01e4d7f78f96cd1"), "item" : "planner", "qty" : 75, "tags" : [ "blank", "red" ], "dim_cm" : [ 22.85, 30 ] }

查詢的至少一個元素值,dim_cm>20的數據

> db.inventory.find({dim_cm:{$gt:20}})
{ "_id" : ObjectId("5e070270c01e4d7f78f96cce"), "item" : "journal", "qty" : 25, "tags" : [ "blank", "red" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("5e070270c01e4d7f78f96ccf"), "item" : "notebook", "qty" : 50, "tags" : [ "red", "blank" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("5e070270c01e4d7f78f96cd0"), "item" : "paper", "qty" : 100, "tags" : [ "red", "blank", "plain" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("5e070270c01e4d7f78f96cd1"), "item" : "planner", "qty" : 75, "tags" : [ "blank", "red" ], "dim_cm" : [ 22.85, 30 ] }
> db.inventory.find({dim_cm:{$gt:21}})
{ "_id" : ObjectId("5e070270c01e4d7f78f96cd1"), "item" : "planner", "qty" : 75, "tags" : [ "blank", "red" ], "dim_cm" : [ 22.85, 30 ] }

但要查詢至少數組的一個元素值是,dim_cm>15 and dim_cm<20,這樣寫是不行的

> db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )
{ "_id" : ObjectId("5e070270c01e4d7f78f96cce"), "item" : "journal", "qty" : 25, "tags" : [ "blank", "red" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("5e070270c01e4d7f78f96ccf"), "item" : "notebook", "qty" : 50, "tags" : [ "red", "blank" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("5e070270c01e4d7f78f96cd0"), "item" : "paper", "qty" : 100, "tags" : [ "red", "blank", "plain" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("5e070270c01e4d7f78f96cd2"), "item" : "postcard", "qty" : 45, "tags" : [ "blue" ], "dim_cm" : [ 10, 15.25 ] }

須要引入 $elemMath 運算符

> db.inventory.find( { dim_cm: {$elemMatch: { $gt: 15, $lt: 20 }} } )
{ "_id" : ObjectId("5e070270c01e4d7f78f96cd2"), "item" : "postcard", "qty" : 45, "tags" : [ "blue" ], "dim_cm" : [ 10, 15.25 ] }

那我只想查詢數組中的第一個元素 dim_cm>25 的數據呢

> db.inventory.find({"dim_cm.1": {$gt: 25}})
{ "_id" : ObjectId("5e070270c01e4d7f78f96cd1"), "item" : "planner", "qty" : 75, "tags" : [ "blank", "red" ], "dim_cm" : [ 22.85, 30 ] }

查詢指定數組長度的數據,好比我想獲得tags的元素數量爲3的數據

> db.inventory.find({tags: {$size: 3}})
{ "_id" : ObjectId("5e070270c01e4d7f78f96cd0"), "item" : "paper", "qty" : 100, "tags" : [ "red", "blank", "plain" ], "dim_cm" : [ 14, 21 ] }

數組中對象的查詢

> db.inventory.insertMany( [
...    { item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] },
...    { item: "notebook", instock: [ { warehouse: "C", qty: 5 } ] },
...    { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 15 } ] },
...    { item: "planner", instock: [ { warehouse: "A", qty: 40 }, { warehouse: "B", qty: 5 } ] },
...    { item: "postcard", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
... ]);
{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("5e070b34c01e4d7f78f96cd3"),
        ObjectId("5e070b34c01e4d7f78f96cd4"),
        ObjectId("5e070b34c01e4d7f78f96cd5"),
        ObjectId("5e070b34c01e4d7f78f96cd6"),
        ObjectId("5e070b34c01e4d7f78f96cd7")
    ]
}
> db.inventory.find()
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96cc9"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96cca"), "item" : "notebook", "qty" : 50, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "A" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccb"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "D" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccc"), "item" : "planner", "qty" : 75, "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "status" : "D" }
{ "_id" : ObjectId("5e06f1f5c01e4d7f78f96ccd"), "item" : "postcard", "qty" : 45, "size" : { "h" : 10, "w" : 15.25, "uom" : "cm" }, "status" : "A" }
{ "_id" : ObjectId("5e070270c01e4d7f78f96cce"), "item" : "journal", "qty" : 25, "tags" : [ "blank", "red" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("5e070270c01e4d7f78f96ccf"), "item" : "notebook", "qty" : 50, "tags" : [ "red", "blank" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("5e070270c01e4d7f78f96cd0"), "item" : "paper", "qty" : 100, "tags" : [ "red", "blank", "plain" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("5e070270c01e4d7f78f96cd1"), "item" : "planner", "qty" : 75, "tags" : [ "blank", "red" ], "dim_cm" : [ 22.85, 30 ] }
{ "_id" : ObjectId("5e070270c01e4d7f78f96cd2"), "item" : "postcard", "qty" : 45, "tags" : [ "blue" ], "dim_cm" : [ 10, 15.25 ] }
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd3"), "item" : "journal", "instock" : [ { "warehouse" : "A", "qty" : 5 }, { "warehouse" : "C", "qty" : 15 } ] }
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd4"), "item" : "notebook", "instock" : [ { "warehouse" : "C", "qty" : 5 } ] }
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd5"), "item" : "paper", "instock" : [ { "warehouse" : "A", "qty" : 60 }, { "warehouse" : "B", "qty" : 15 } ] }
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd6"), "item" : "planner", "instock" : [ { "warehouse" : "A", "qty" : 40 }, { "warehouse" : "B", "qty" : 5 } ] }
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd7"), "item" : "postcard", "instock" : [ { "warehouse" : "B", "qty" : 15 }, { "warehouse" : "C", "qty" : 35 } ] }

首先,常規的寫法,元素的數量,順序都一致,不然查詢不到數據

> db.inventory.find({instock: {warehouse: "A",qty: 5}})
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd3"), "item" : "journal", "instock" : [ { "warehouse" : "A", "qty" : 5 }, { "warehouse" : "C", "qty" : 15 } ] }
> db.inventory.find({instock: {qyt:5, warehouse: "A"}})
>

我要查詢 instock 數組中,包含 qty,而且至少要有一個值是 qty <= 20的記錄

> db.inventory.find({"instock.qty": {$lte: 20}})
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd3"), "item" : "journal", "instock" : [ { "warehouse" : "A", "qty" : 5 }, { "warehouse" : "C", "qty" : 15 } ] }
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd4"), "item" : "notebook", "instock" : [ { "warehouse" : "C", "qty" : 5 } ] }
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd5"), "item" : "paper", "instock" : [ { "warehouse" : "A", "qty" : 60 }, { "warehouse" : "B", "qty" : 15 } ] }
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd6"), "item" : "planner", "instock" : [ { "warehouse" : "A", "qty" : 40 }, { "warehouse" : "B", "qty" : 5 } ] }
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd7"), "item" : "postcard", "instock" : [ { "warehouse" : "B", "qty" : 15 }, { "warehouse" : "C", "qty" : 35 } ] }

固然也能夠指定數組的序號,好比上面的查詢,我只想查詢到序號爲0的

> db.inventory.find({"instock.0.qty": {$lte: 20}})
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd3"), "item" : "journal", "instock" : [ { "warehouse" : "A", "qty" : 5 }, { "warehouse" : "C", "qty" : 15 } ] }
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd4"), "item" : "notebook", "instock" : [ { "warehouse" : "C", "qty" : 5 } ] }
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd7"), "item" : "postcard", "instock" : [ { "warehouse" : "B", "qty" : 15 }, { "warehouse" : "C", "qty" : 35 } ] }
>

目前說的都是一個元素的,若是是多個呢?還得用到$elemMatch

> db.inventory.find({"instock": {$elemMatch: {qty: {$gt: 10, $lte: 20}}}})
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd3"), "item" : "journal", "instock" : [ { "warehouse" : "A", "qty" : 5 }, { "warehouse" : "C", "qty" : 15 } ] }
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd5"), "item" : "paper", "instock" : [ { "warehouse" : "A", "qty" : 60 }, { "warehouse" : "B", "qty" : 15 } ] }
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd7"), "item" : "postcard", "instock" : [ { "warehouse" : "B", "qty" : 15 }, { "warehouse" : "C", "qty" : 35 } ] }

比較一下下面這個,只知足一個條件便可,上面的則必須都知足才行

> db.inventory.find( { "instock.qty": { $gt: 10,  $lte: 20 } } )
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd3"), "item" : "journal", "instock" : [ { "warehouse" : "A", "qty" : 5 }, { "warehouse" : "C", "qty" : 15 } ] }
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd5"), "item" : "paper", "instock" : [ { "warehouse" : "A", "qty" : 60 }, { "warehouse" : "B", "qty" : 15 } ] }
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd6"), "item" : "planner", "instock" : [ { "warehouse" : "A", "qty" : 40 }, { "warehouse" : "B", "qty" : 5 } ] }
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd7"), "item" : "postcard", "instock" : [ { "warehouse" : "B", "qty" : 15 }, { "warehouse" : "C", "qty" : 35 } ] }

這樣也能夠

> db.inventory.find({"instock": {$elemMatch: {qty: 5,warehouse: "A"}}})
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd3"), "item" : "journal", "instock" : [ { "warehouse" : "A", "qty" : 5 }, { "warehouse" : "C", "qty" : 15 } ] }

但這樣不行,也就是混合查詢中不能使用 $elemMatch

> db.inventory.find({"instock": {$elemMatch: {qty: {$lte: 20,$gt: 10},warehouse: "A"}}})

那怎麼辦,這樣處理,拆開

> db.inventory.find({"instock.qty": {$lte: 20,$gt: 10},"instock.warehouse": "A"})
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd3"), "item" : "journal", "instock" : [ { "warehouse" : "A", "qty" : 5 }, { "warehouse" : "C", "qty" : 15 } ] }
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd5"), "item" : "paper", "instock" : [ { "warehouse" : "A", "qty" : 60 }, { "warehouse" : "B", "qty" : 15 } ] }
{ "_id" : ObjectId("5e070b34c01e4d7f78f96cd6"), "item" : "planner", "instock" : [ { "warehouse" : "A", "qty" : 40 }, { "warehouse" : "B", "qty" : 5 } ] }

最後

今天先這些了,數組與對象混合這個,只能多練習,要否則……

相關文章
相關標籤/搜索