嵌套文档查询注意$elemMatch、**.字段:** 和 **:{**:**,**:**} 可能不同
(1)
单个嵌套文档中的字段满足多个查询条件
使用$elemMatch操作符为数组中的嵌套文档指定多个查询条件,最少一个嵌套文档同时满足所有的查询条件。
下面的案例返回instock数组中最少有一个嵌套文档包含qty等于5同时warhouse等于A的所有文档:
db.inventory.find( { "instock": { $elemMatch: { qty: 5, warehouse: "A" } } } )
下面的案例返回instock数组中最少一个嵌套文档包含字段qty大于10并且小于20的所有文档:
db.inventory.find( { "instock": { elemMatch: { qty: { gt: 10, $lte: 20 } } } } )
(2) 如果数组字段上的联合查询条件没有使用 $elemMatch运算符,查询返回数组字段中多个元素联合满足所有的查询条件的所有文档。
下面的案例返回数组字段instock中嵌套文档中qty字段大于10并且数组中其它嵌套文档(不一定是同一个嵌套文档)qty字段小于等于20的所有文档:
db.inventory.find( { "instock.qty": { lte: 20 } } )
下面的案例返回数组字段instock中最少一个嵌套文档包含qty等于5并且最少一个嵌套文档(不一定是同一个嵌套文档)包含warehouse字段等于A的所有文档:
db.inventory.find( { "instock.qty": 5, "instock.warehouse": "A" } )
(3) 注意查询条件顺序,必须包含,只包含,包含“或” “与”的关系,以及下方:
db.inventory.find( { tags: { $all: ["red", "blank"] } } )
(4) dim_cm 为单一类型元素数组 进行范围查找匹配每个元素,返回结果
db.inventory.find( { dim_cm: { elemMatch: { gt: 22, $lt: 30 } } } )
(5) 查询语句执行计划explain("executionStats")
db.stores.find({name:"Java Shopping"}).explain("executionStats")
(6) 强制索引 hint()
db.users.find().hint( { age: 1 } ) (7) 管道流聚合分组 注意顺序 skip limit 未测试
db.orders.aggregate([
{ match: { status: "A" } }, { order: { cust_id: -1 } }, { skip: 10 }, { limit: 10 },
{ group: { _id: "cust_id", total: { amount" } } } ])
$geoNear
$geoNear管道运算符利用地理空间索引。在使用时$geoNear, $geoNear管道操作必须出现在聚合管道的第一阶段出现
(7) 仅查询索引要比查询索引之外的文档
{ _id: 1, user: { login: "tester" } } //例如,考虑一个userdata集合,它具有以下形式的文档:
该集合具有以下索引: { "user.login": 1 }
db.userdata.find( { "user.login": "tester" }, { "user.login": 1, _id: 0 } )
要为嵌入式文档中的字段建立索引,请使用点符号 。
文档必须显式地指定_id: 0来从结果中排除_id字段,因为索引不包括_id字段
(8)
使用索引要查看所选的查询计划,请将cursor.explain("executionStats")游标方法链接到find命令的末尾
返回计划结果 中查看
"executionStats" :
"nReturned" : 2, //返回条数结果
"totalKeysExamined" : 2, // 扫描总条数
"totalDocsExamined" : 2, // 扫描总文档数
(9)索引 复合索引 注意:排序
应用程序可以发出查询,返回的结果首先按升序username值排序,然后按降序(即从最近到最后)date排序,例如: db.events.find().sort( { username: 1, date: -1 } )
或先按username 降序再按date升序的查询,例如: db.events.find().sort({ username: -1, date: 1 })
以下索引可以支持上面这两种排序操作: db.events.createIndex( { "username" : 1, "date" : -1 } )
但是,上面的索引不支持先升序username值再升序 date值排序,例如:
db.events.find().sort( { username: 1, date: 1 } )