mongodb查询$ all的对面

neo*_*uiz 8 mongodb

我正在尝试学习MongoDB,到目前为止它已经很棒了.但是我碰到了一个情况,我不太清楚如何解决它.希望有人可以帮助我,并提前感谢.

我想得到(整个)数组值在查询中的记录.例如:

记录1:

{"name" : "Mango Shake", 
 "ingredients" : [{"type" : "fruit", "name" : "mango"},
                  {"type" : "milk", "name" : "soy milk"}]}
Run Code Online (Sandbox Code Playgroud)

记录2:

{"name" : "Mango Banana Shake", 
 "ingredients" : [{"type" : "fruit", "name" : "mango"},
                  {"type" : "milk", "name" : "soy milk"},
                  {"type" : "fruit", "name" : "banana"}]}
Run Code Online (Sandbox Code Playgroud)

记录3:

{"name" : "Milk Shake", 
 "ingredients" : [{"type" : "milk", "name" : "soy milk"}]}
Run Code Online (Sandbox Code Playgroud)

然后我会有一个类似的查询

{"ingredients" : {$all : [{"type" : "fruit", "name" : "mango"},
                          {"type" : "milk", "name" : "soy milk"},
                          {"type" : "fruit", "name" : "strawberry"}]}}
Run Code Online (Sandbox Code Playgroud)

因为我有芒果,豆浆和草莓.所以我想知道我能做些什么.显然这不返回任何东西,因为查询不能有额外的东西.如果我使用$in那么所有人都将返回,但我不能做芒果香蕉奶昔,因为我没有香蕉..

所以我唯一需要的是第一个和最后一个.任何的想法?欣赏它:)

Phi*_*ipp 0

我想不出用 find 来做到这一点的方法。但你可以用mapReduce来做到这一点。

您的地图函数将迭代当前检查的文档的成分,并且仅当所有字段都是您拥有的成分时才发出它。您不需要为此使用reduce 函数,因此发出值的键应该是饮料文档的_id。

当键是唯一的时,永远不应该调用reduce函数(reduce函数用于确定为同一键发出多个值时会发生什么)。我不认为你可以忽略reduce函数,所以你应该编写一个只返回值数组的第一个元素的函数。