Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB查询带排除的数组字段_Mongodb - Fatal编程技术网

MongoDB查询带排除的数组字段

MongoDB查询带排除的数组字段,mongodb,Mongodb,我四处搜索了一下,但是找不到使用MongoDB的方法——或者我只是误解了$all和$in操作符 如果我有以下文件: { arr : ["foo","bar","baz"] }, { arr : ["bar","foo"] }, { arr : ["foo"] } 我想要一个返回最后两个文档的查询。基本上,任何文档只包含[“foo”,“bar”]的任意组合,但不包括任何包含附加项的内容。这是我无法理解的排除方面-基本上对于给定的数组,只返回arr字段仅包含该数组中元素的文档 >

我四处搜索了一下,但是找不到使用MongoDB的方法——或者我只是误解了$all和$in操作符

如果我有以下文件:

{
  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为例。