一、shell執行mongodb查詢(簡單json數據結構)
查詢所有:db.inventory.find() 按條件查詢:db.inventory.find( { status: "D" } ) in條件查詢:db.inventory.find( { status: { $in: [ "A", "D" ] } } ) and和范圍條件查詢:db.inventory.find( { status: "A", qty: { $lt: 30 } } ) or條件查詢:db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } ) and和or的復合條件:db.inventory.find( {status: "A", $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]}) 查詢一條:db.collection.findOne()
二、python執行mongodb查詢(簡單json數據結構)
查詢所有:cursor = db.inventory.find({}) 條件查詢:cursor = db.inventory.find({"status": "D"}) in條件查詢:cursor = db.inventory.find({"status": {"$in": ["A", "D"]}}) and條件查詢:cursor = db.inventory.find({"status": "A", "qty": {"$lt": 30}}) or條件查詢:cursor = db.inventory.find({"$or": [{"status": "A"}, {"qty": {"$lt": 30}}]} and和or的復合條件:cursor = db.inventory.find({"status": "A","$or": [{"qty": {"$lt": 30}}, {"item": {"$regex": "^p"}}]}) 查詢一條:pymongo.collection.Collection.find_one()
三、java執行mongodb查詢(簡單json數據結構)
查詢所有:FindIterable<Document> findIterable = collection.find(new Document()); 條件查詢:findIterable = collection.find(eq("status", "D")); in條件查詢:findIterable = collection.find(in("status", "A", "D")); and條件查詢:findIterable = collection.find(and(eq("status", "A"), lt("qty", 30))); or條件查詢:findIterable = collection.find(or(eq("status", "A"), lt("qty", 30))); and和or的復合條件:findIterable = collection.find(and(eq("status", "A"),or(lt("qty", 30), regex("item", "^p"))));
四、嵌套json數據格式的查詢:
1.shell方式:
如果數據格式如下:
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" } ]);
那么,shell如下用.的方式進行json數據獲取,也可以進行各種條件的查詢。
db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )能查到 db.inventory.find( { size: { w: 21, h: 14, uom: "cm" } } )查不到 (json中的數據一體化,位置不可移動) db.inventory.find( { "size.uom": "in" } ) # 執行條件的查詢 db.inventory.find( { "size.h": { $lt: 15 } } ) # 范圍條件的查詢 db.inventory.find( { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" } ) #and條件的查詢
2.python方式:
如果數據格式如下:
from bson.son import SON db.inventory.insert_many([ {"item": "journal", "qty": 25, "size": SON([("h", 14), ("w", 21), ("uom", "cm")]), "status": "A"}, {"item": "notebook", "qty": 50, "size": SON([("h", 8.5), ("w", 11), ("uom", "in")]), "status": "A"}, {"item": "paper", "qty": 100, "size": SON([("h", 8.5), ("w", 11), ("uom", "in")]), "status": "D"}, {"item": "planner", "qty": 75, "size": SON([("h", 22.85), ("w", 30), ("uom", "cm")]), "status": "D"}, {"item": "postcard", "qty": 45, "size": SON([("h", 10), ("w", 15.25), ("uom", "cm")]), "status": "A"}])
python嵌入式查詢語句如下:
cursor = db.inventory.find({"size": SON([("h", 14), ("w", 21), ("uom", "cm")])}) cursor = db.inventory.find({"size": SON([("w", 21), ("h", 14), ("uom", "cm")])}) cursor = db.inventory.find({"size.uom": "in"}) cursor = db.inventory.find({"size.h": {"$lt": 15}}) cursor = db.inventory.find({"size.h": {"$lt": 15}, "size.uom": "in", "status": "D"})
五、嵌套array數據格式的查詢:
1.shell查詢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 ] } ]);
shell查詢語句如下:
db.inventory.find( { tags: ["red", "blank"] } ) # 查詢array固定內容的數據 db.inventory.find( { tags: { $all: ["red", "blank"] } } ) # 數據含有 red和blank同時有 的數據 db.inventory.find( { tags: "red" } ) # 數據含有 red 的數據 db.inventory.find( { dim_cm: { $gt: 25 } } ) # 數據含有 數據大於25 的數據 db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } ) # 數據含有 其中一個數據大於15 另一個數據小於20 的數據 db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } ) # 數據含有 可以同時滿足 大於22並且小於30 的數據 db.inventory.find( { "dim_cm.1": { $gt: 25 } } ) # 查詢dim_cm中的第二個元素大於25 的數據 db.inventory.find( { "tags": { $size: 3 } } ) # 查詢tags array中的元素為3個 的數據
python查詢語句如下:
cursor = db.inventory.find({"tags": ["red", "blank"]}) cursor = db.inventory.find({"tags": {"$all": ["red", "blank"]}}) cursor = db.inventory.find({"tags": "red"}) cursor = db.inventory.find({"dim_cm": {"$gt": 25}}) cursor = db.inventory.find({"dim_cm": {"$gt": 15, "$lt": 20}}) cursor = db.inventory.find({"dim_cm": {"$elemMatch": {"$gt": 22, "$lt": 30}}}) cursor = db.inventory.find({"dim_cm.1": {"$gt": 25}}) cursor = db.inventory.find({"tags": {"$size": 3}})
六、同時嵌套array和json數據格式的查詢:
如果數據如下:
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 } ] } ]);
shell查詢語句如下:
db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } ) # 查詢含有 instock array中的json元素為{ warehouse: "A", qty: 5 } 的數據 db.inventory.find( { "instock": { qty: 5, warehouse: "A" } } ) # 查詢含有 instock array中的json元素為{qty: 5, warehouse: "A" } 的數據查不到 (json中的數據一體化,位置不可移動) db.inventory.find( { 'instock.0.qty': { $lte: 20 } } ) # 查詢含有 instock中的第一個json元素中的qty字段小於或等於 20 的數據 db.inventory.find( { 'instock.qty': { $lte: 20 } } ) # 查詢含有 instock中的任意json元素中的qty小於或等於 20 的數據 db.inventory.find( { "instock": { $elemMatch: { qty: 5, warehouse: "A" } } } ) # 查詢含有 instock中的json元素 同時滿足qty為5,warehouse為A 的數據 db.inventory.find( { "instock": { $elemMatch: { qty: { $gt: 10, $lte: 20 } } } } ) # 查詢含有 instock中的json元素 同時滿足qty大於10並小於等於20 的數據 # 如果不用 $elemMatch: 函數 db.inventory.find( { "instock.qty": 5, "instock.warehouse": "A" } )# 查詢含有 instock中的qty為5 或者 instock中的warehousr為A 的數據 db.inventory.find( { "instock.qty": { $gt: 10, $lte: 20 } } ) # 查詢含有 instock中的qty 大於10 或 小於等於20 的數據
七、篩選查詢結果的字段:
如果數據結構為:
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 } ] } ]);
查詢語句和字段篩選的操作為:
db.inventory.find( { status: "A" } ) # 管道1:查詢status為A的數據 db.inventory.find( { status: "A" }, { item: 1, status: 1 } ) # 管道1:查詢status為A的數據; 管道2:只顯示item和status字段 (和_id字段 默認顯示) db.inventory.find( { status: "A" }, { item: 1, status: 1, _id: 0 } ) # 管道1:查詢status為A的數據; 管道2:只顯示item和status字段 (隱藏_id字段) db.inventory.find( { status: "A" }, { status: 0, instock: 0 } ) # 管道1:查詢status為A的數據; 管道2:除去status和instock 其他都顯示 db.inventory.find({ status: "A" }, { item: 1, status: 1, "size.uom": 1 } ) # 管道1:查詢status為A的數據; 管道2:只顯示item和status和size中的uom字段 db.inventory.find({ status: "A" },{ "size.uom": 0 }) # 管道1:查詢status為A的數據; 管道2: 除去size中的uom字段 其他都顯示 db.inventory.find( { status: "A" }, { item: 1, status: 1, "instock.qty": 1 } ) # 管道1:查詢status為A的數據; 管道2:只顯示 item和status和instock中的qty字段 db.inventory.find( { status: "A" }, { name: 1, status: 1, instock: { $slice: -1 } } ) # 管道1:查詢status為A的數據; 管道2:只顯示name和status和instock中的倒數第一個元素
八、字段不存在和null字段的不同之處:
數據為:
db.inventory.insertMany([ { _id: 1, item: null }, { _id: 2 } ])
查詢語句為:
db.inventory.find( { item: null } ) # 查詢所有 item不存在或為null 的數據 db.inventory.find( { item : { $type: 10 } } ) # 查詢所有 item存在 但是為null 的數據 db.inventory.find( { item : { $exists: false } } ) # 查詢所有 不存在item 的數據