假设这样的集合:
{
movie : 1,
List : [ 1 , 2 ,5 , 6 ]
},
{
movie : 2,
List : [ 3, 5, 7 ]
},
{
movie : 3,
List : [ 1, 3, 6 ]
}
我想获取“列表”中存在“电影”的所有文档。
如何编写查询或汇总?
这样做的理想形式是使用本地运营商.aggregate()
有$redact
:
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
的值,然后将其降低到逻辑单true/false
通过$anyElementTrue
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句