Open msforest opened 4 years ago
\$elemMatch 和点运算符都是匹配数组里面嵌套的字段
db.inventory.find( { "instock": { $elemMatch: { qty: { $gt: 10, $lte: 20 } } } } ) db.inventory.find( { "instock.qty": { $gt: 10, $lte: 20 } } )
两个都是匹配10<qty<=20,查出来的结果却有点不一样;$elemMatch是对数组嵌套的同一条记录的字段值要同时满足条件,即 qty>10 且 qty<=20;点运算符是数组中包含一条记录 a 存在 qty>10 和一条记录 b 存在 qty<=20(a 不一定等于 b)
10<qty<=20
$elemMatch
例如:
> 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 } ] } ]); > db.inventory.find( { "instock": { $elemMatch: { qty: { $gt: 10, $lte: 20 } } } } , {_id: 0}) //匹配的结果得在同一个记录里 { "item" : "journal", "instock" : [ { "warehouse" : "A", "qty" : 5 }, { "warehouse" : "C", "qty" : 15 } ] } { "item" : "paper", "instock" : [ { "warehouse" : "A", "qty" : 60 }, { "warehouse" : "B", "qty" : 15 } ] } { "item" : "postcard", "instock" : [ { "warehouse" : "B", "qty" : 15 }, { "warehouse" : "C", "qty" : 35 } ] } > db.inventory.find( { "instock.qty": { $gt: 10, $lte: 20 } } ,{_id: 0}) //匹配的结果可以不在同一个记录里 { "item" : "journal", "instock" : [ { "warehouse" : "A", "qty" : 5 }, { "warehouse" : "C", "qty" : 15 } ] } { "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 } ] } > db.inventory.find( { "instock.qty": 5, "instock.warehouse": "A" } ,{_id: 0}) //匹配的结果可以不在同一个记录里 { "item" : "journal", "instock" : [ { "warehouse" : "A", "qty" : 5 }, { "warehouse" : "C", "qty" : 15 } ] } { "item" : "planner", "instock" : [ { "warehouse" : "A", "qty" : 40 }, { "warehouse" : "B", "qty" : 5 } ] }
资料参考 query-array-of-documents
\$elemMatch vs dot notation
\$elemMatch 和点运算符都是匹配数组里面嵌套的字段
两个都是匹配
10<qty<=20
,查出来的结果却有点不一样;$elemMatch
是对数组嵌套的同一条记录的字段值要同时满足条件,即 qty>10 且 qty<=20;点运算符是数组中包含一条记录 a 存在 qty>10 和一条记录 b 存在 qty<=20(a 不一定等于 b)例如:
资料参考 query-array-of-documents
\$elemMatch vs dot notation