假设这样的集合:
{
movie : 1,
List : [ 1 , 2 ,5 , 6 ]
},
{
movie : 2,
List : [ 3, 5, 7 ]
},
{
movie : 3,
List : [ 1, 3, 6 ]
}
我想要获得所有电影'电影'存在于'列表'。
中如何编写查询或聚合?
答案 0 :(得分:1)
理想的形式是本地运营商使用.aggregate()
和$redact
:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$setIsSubset": [
{ "$map": { "input": ["A"], "as": "el", "in": "$movie" } },
"$List"
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
如果您的MongoDB版本中没有$redact
,请改用$where
查询条件:
db.collection.find(function() {
return this.List.indexOf(this.movie) != 1
})
两者都有基本的方法来查找文档中数组字段中存在的一个字段的值。
您可以使用$redact
使用几种不同的表单,例如此$anyElementTrue
来电:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$anyElementTrue": {
"$map": {
"input": "$List",
"as": "el",
"in": { "$eq": [ "$$el", "$movie" ] }
}
}
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
以及MongoDB 3.2的原始语法更短:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$setIsSubset": [
["$movie"],
"$List"
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
正如使用$map
一样,["$movie"]
使单个元素成为您使用$setIsSubset
进行比较的数组/集合。在后一种情况下,$map
只是将一个条件应用于数组的每个元素,以返回true/false
值的数组,然后通过{{3}将其减少为逻辑单true/false
}。