假设集合是这样的:
{
movie : 1,
List : [ 1 , 2 ,5 , 6 ]
},
{
movie : 2,
List : [ 3, 5, 7 ]
},
{
movie : 3,
List : [ 1, 3, 6 ]
}
我想获取“列表”中存在“电影”的所有文档。
如何编写查询或聚合?
最佳答案
理想的形式是使用带有 $redact
的 .aggregate()
的原生运算符:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$setIsSubset": [
{ "$map": { "input": ["A"], "as": "el", "in": "$movie" } },
"$List"
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
或者如果您没有 $redact
在您的 MongoDB 版本中可用,请改用 $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
值的数组,然后通过 $anyElementTrue
将其简化为逻辑单个 true/false
.
关于javascript - 查询一个字段等于另一个数组字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36562629/