MongoDB查询带排除的数组字段
我四处搜索了一下,但是找不到使用MongoDB的方法——或者我只是误解了$all和$in操作符 如果我有以下文件:MongoDB查询带排除的数组字段,mongodb,Mongodb,我四处搜索了一下,但是找不到使用MongoDB的方法——或者我只是误解了$all和$in操作符 如果我有以下文件: { arr : ["foo","bar","baz"] }, { arr : ["bar","foo"] }, { arr : ["foo"] } 我想要一个返回最后两个文档的查询。基本上,任何文档只包含[“foo”,“bar”]的任意组合,但不包括任何包含附加项的内容。这是我无法理解的排除方面-基本上对于给定的数组,只返回arr字段仅包含该数组中元素的文档 >
{
arr : ["foo","bar","baz"]
},
{
arr : ["bar","foo"]
},
{
arr : ["foo"]
}
我想要一个返回最后两个文档的查询。基本上,任何文档只包含[“foo”,“bar”]
的任意组合,但不包括任何包含附加项的内容。这是我无法理解的排除方面-基本上对于给定的数组,只返回arr
字段仅包含该数组中元素的文档
> db.foo.find({arr : {"$in" : ["foo", "bar"]}})
{ "_id" : ObjectId("532a0ff6907560a1e88a2c0a"), "arr" : [ "foo", "bar", "baz" ] }
{ "_id" : ObjectId("532a0ffc907560a1e88a2c0b"), "arr" : [ "foo", "bar" ] }
{ "_id" : ObjectId("532a0ffe907560a1e88a2c0c"), "arr" : [ "foo" ] }
> db.foo.find({arr : {"$all" : ["foo", "bar"]}})
{ "_id" : ObjectId("532a0ff6907560a1e88a2c0a"), "arr" : [ "foo", "bar", "baz" ] }
{ "_id" : ObjectId("532a0ffc907560a1e88a2c0b"), "arr" : [ "foo", "bar" ] }
>
这可能吗?我不知道在查询时哪些值是可排除的。您可以使用来实现您想要的。该查询类似于:
db.collection.aggregate([
{$unwind:$arr},
{$group:{
_id:“$\u id”,
//如果arr为“foo”或“bar”,则将0添加到总和,否则将1添加到总和
排除:{$sum:{$cond:[{$or:[{$eq:[“$arr”,“foo”]},{$eq:[“$arr”,“bar”]}]},0,1]},
//排除“排除”计数非零的所有文档
{$match:{exclude:0}
])
您可以通过组合多个运算符来完成此操作:
db.foo.find({arr:{$not:{$elemMatch:{$nin:['foo','bar']})
带有$nin
的$elemMatch
查找单个arr
元素既不是“foo”也不是“bar”的文档,然后父$not
反转匹配以返回与任何元素都不匹配的所有文档
但是,这也将返回arr
缺失或没有元素的文档。要排除这些元素,您需要在限定符中$和,以确保arr
至少有一个元素:
db.foo.find({$and:[
{arr:{$not:{$elemMatch:{$nin:['foo','bar']}},
{'arr.0':{$exists:true}
]})
这些值可以在数组中重复吗?这是一个很好的问题-不,它们不能是arr中固定的项目数吗?不,这个数字不固定。我还没有使用这个框架。那么,用简单的查询似乎是不可能的-至少不使用$where和函数谢谢你,好先生,我已经搜索了一整天了。以我的+1为例。