Mongodb查询
一、基础查询
1.插入基础数据
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" } ]);
2.查全部数据
db.inventory.find( {} )
等同于
SELECT * FROM inventory
3.单个条件搜索
db.inventory.find( { status: "D" } ) 等价于 SELECT * FROM inventory WHERE status = "D"
4.单个字段使用in
db.inventory.find( { status: { $in: [ "A", "D" ] } } ) 等价于 SELECT * FROM inventory WHERE status in ("A", "D")
5.多个条件and
db.inventory.find( { status: "A", qty: { $lt: 30 } } ) 等价于 SELECT * FROM inventory WHERE status = "A" AND qty < 30
6.多个条件or
db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } ) 等价于 SELECT * FROM inventory WHERE status = "A" OR qty < 30
7.多个条件and和or混用
db.inventory.find( { status: "A", $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ] } ) 等价于 SELECT * FROM inventory WHERE status = "A" AND ( qty < 30 OR item LIKE "p%")
二、内嵌查询
1.插入基础数据
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" } ]);
2.查询内嵌文档多个字段(需要按定义的顺序,否则查不出来)
db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )
结果
3.查询部分字段
db.inventory.find( { "size.uom": "in" } )
结果
4.查范围
db.inventory.find( { "size.h": { $lt: 15 } } )
结果
5.多条件混合
db.inventory.find( { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" } )
结果
三、数组查询
基础数据
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 ] } ]);
1.数组多个字查询
db.inventory.find( { tags: ["red", "blank"] } )
严格符合才会出现
结果
2.同时包含2个元素,但也可以包含其他元素
db.inventory.find( { tags: { $all: ["red", "blank"] } } )
结果
3.包含一个条件
db.inventory.find( { tags: "red" } )
只要存在red元素的都符合要求,结果
4.范围条件
包含至少一个值大于25的元素的所有文档
db.inventory.find( { dim_cm: { $gt: 25 } } )
结果
一个元素可以满足大于15的条件,另一个元素可以满足小于20的条件,或者单个元素可以同时满足这两个条件
db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )
结果
至少有一个元素是>22并且<30的
db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )
结果
第2个元素大于25(下标从0开始)
db.inventory.find( { "dim_cm.1": { $gt: 25 } } )
结果
5.指定数组数量
db.inventory.find( { "tags": { $size: 3 } } )
结果
四、数组内嵌对象查询
基础数据
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 } ] } ]);
1.查询数组的一个元素
精确查询instock数组的一个元素值,warehouse=A,qty=5,并且严格按照此顺序
db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )
结果
整个嵌入/嵌套文档上的相等匹配要求与指定文档(包括字段顺序)完全匹配。例如,以下查询与库存集合中的任何文档都不匹配:
db.inventory.find( { "instock": { qty: 5, warehouse: "A" } } )
2.指定一个元素值范围
查询instock数组的qty元素,符合<=20的记录
db.inventory.find( { 'instock.qty': { $lte: 20 } } )
结果
3.指定数组第1个元素的属性查询
instock数组第一个元素的qty<=20的查询
db.inventory.find( { 'instock.0.qty': { $lte: 20 } } )
结果
4.某一个元素符合的查询
instock数组中至少有一个嵌入文档同时包含字段qty等于5和字段warehouse等于A的文档
db.inventory.find( { "instock": { $elemMatch: { qty: 5, warehouse: "A" } } } )
结果
instock数组中至少有一个嵌入文档包含大于10且小于或等于20的字段qty的文档
db.inventory.find( { "instock": { $elemMatch: { qty: { $gt: 10, $lte: 20 } } } } )
结果
5.使用数组元素的指定属性
如果instock数组中嵌套的任何文档的qty字段大于10,并且数组中的任何文档(但不一定是同一嵌入文档)的qty字段小于或等于20,则以下查询将匹配这些文档
db.inventory.find( { "instock.qty": { $gt: 10, $lte: 20 } } )
结果
查询instock数组中至少有一个包含字段qty等于5的嵌入文档和至少一个包含字段warehouse等于A的嵌入文档(但不一定是同一个嵌入文档)的文档
db.inventory.find( { "instock.qty": 5, "instock.warehouse": "A" } )
结果
五.从查询返回指定字段
基础数据
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 } ] } ]);
1.返回指定字段
db.inventory.find( { status: "A" } )
等价于
SELECT * from inventory WHERE status = "A"
查询指定字段
db.inventory.find( { status: "A" }, { item: 1, status: 1 } ) 等价于 SELECT _id, item, status from inventory WHERE status = "A"
结果
不显示Id
db.inventory.find( { status: "A" }, { item: 1, status: 1, _id: 0 } ) 等价于 SELECT item, status from inventory WHERE status = "A"
结果
2返回全部字段,除了剔除的字段
db.inventory.find( { status: "A" }, { status: 0, instock: 0 } )
结果
3.返回内嵌文档指定字段
返回item、status、size字段的uom属性(其他属性不显示)
db.inventory.find( { status: "A" }, { item: 1, status: 1, "size.uom": 1 } )
结果
屏蔽内嵌文档的指定属性
db.inventory.find( { status: "A" }, { "size.uom": 0 } )
结果
4.返回数组的指定属性
显示item、status、instock数组的qty属性
db.inventory.find( { status: "A" }, { item: 1, status: 1, "instock.qty": 1 } )
结果
对于包含数组的字段,MongoDB提供了以下用于操作数组的投影运算符:$elemMatch、$slice和$。
以下示例使用$slice projection运算符返回instock数组中的最后一个元素:
$slice: -1 显示instock数组的最后一个元素
$slice: 0 显示instock数组的第一个元素
db.inventory.find( { status: "A" }, { item: 1, status: 1, instock: { $slice: -1 } } )
结果
db.inventory.find( { status: "A" }, { item: 1, status: 1, instock: { $slice: 1 } } )
结果
六.查询null值和不存在字段
基础数据
db.inventory.insertMany([ { _id: 1, item: null }, { _id: 2 } ])
1.查询null值
db.inventory.find( { item: null } )
结果
2.类型检查
{item:{$type:10}}查询只匹配包含值为空的item字段的文档;即item字段的值为BSON type null(类型号10):
db.inventory.find( { item : { $type: 10 } } )
结果
3.字段存在性检查
以下示例查询不包含字段的文档。
{ item : { $exists: false } }查询匹配不包含项目字段的文档
db.inventory.find( { item : { $exists: false } } )
结果
七.在mongodb shell里面使用循环游标
1.循环游标
var myCursor = db.users.find( { type: 2 } );
myCursor
var myCursor = db.users.find( { type: 2 } ); while (myCursor.hasNext()) { print(tojson(myCursor.next())); }
printjson()
替换 print(tojson())
var myCursor = db.users.find( { type: 2 } ); while (myCursor.hasNext()) { printjson(myCursor.next()); }
var myCursor = db.users.find( { type: 2 } ); myCursor.forEach(printjson);
2.迭代器index
var myCursor = db.inventory.find( { type: 2 } ); var documentArray = myCursor.toArray(); var myDocument = documentArray[3];
var myCursor = db.users.find( { type: 2 } ); var myDocument = myCursor[1]; myCursor[1]等同于 myCursor.toArray() [1];