MongoDB日常查询语句记录

114 阅读2分钟

嵌套文档查询注意$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": { gt:10,gt: 10, 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: { sum:"sum: "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 } )