我在产品系列中有以下文件 .
db.product.find()
{ "_id" : 1, "results" : [ { "product" : "abc", "score" : 10 }, { "product" : "xyz", "score" : 5 } ] }
{ "_id" : 2, "results" : [ { "product" : "abc", "score" : 8 }, { "product" : "xyz", "score" : 7 } ] }
{ "_id" : 3, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "xyz", "score" : 8 } ] }
以下查询使用elemMatch按预期返回结果 .
> db.product.find( { results : { $elemMatch : { product : "xyz" , score : { $eq : 5} } } } )
{ "_id" : 1, "results" : [ { "product" : "abc", "score" : 10 }, { "product" : "xyz", "score" : 5 } ] }
同样,这也会返回预期的结果 .
> db.product.find( { results : { product : "xyz" , score : 5 } } )
{ "_id" : 1, "results" : [ { "product" : "abc", "score" : 10 }, { "product" : "xyz", "score" : 5 } ] }
但是当我在数组中使用比较运算符时,我没有得到任何结果 .
db.product.find( { results : { product : "xyz" , score : { $eq : 5} } } )
我无法弄清楚这种意想不到的行为 .
2 回答
有两种方法可以进行查询:传递子文档和使用点表示法 .
要查询嵌套字段,您应该使用点表示法 . 这意味着你需要做:
如果你像那样传递一个子文档,那么mongoDB会完全匹配 . 这意味着不应该有任何其他属性,基本上在你的情况下,它希望得分为{“$ eq”:5}(字面上有名为$ eq的属性)
欲了解更多信息,请查看this answer和documentation .
我已经为所有4个命令运行了解释 . 以下是mongoDB在内部创建的过滤器: