Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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,我正在尝试查找所有不包含至少一个具有特定字段值的文档的文档。例如,以下是一个样本集合: { _id : 1, docs : [ { foo : 1, bar : 2}, { foo : 3, bar : 3} ] }, { _id : 2, docs : [ { foo : 2, bar : 2}, { foo : 3, b

我正在尝试查找所有不包含至少一个具有特定字段值的文档的文档。例如,以下是一个样本集合:

{  _id : 1,
  docs : [
        { foo : 1,
          bar : 2},
        { foo : 3,
          bar : 3}
         ]
},
{  _id : 2,
  docs : [
        { foo : 2,
          bar : 2},
        { foo : 3,
          bar : 3}
         ]
}
我想找到docs块中没有文档的每个记录,该文档不包含至少一条foo=1的记录。在上面的示例中,只应返回第二个文档

我尝试了以下内容,但它只告诉我是否有不匹配的内容(返回文档1)

db.collection.find({"docs": { $not: {$elemMatch: {foo: 1 } } } })
更新:上面的查询确实有效。很多时候,我的数据是错误的,而不是我的代码

我也看过了,但是示例只显示了数组包含基元值列表时的情况,而不是其他文档。当我尝试使用以下内容时,它会查找确切的文档,而不仅仅是我想要的foo字段

db.collection.find({"docs": { $nin: {'foo':1 } } })
使用基本运算符是否可以完成此操作?

使用将起作用,但语法错误。应该是:

db.collection.find({'docs.foo':{$nin:[1]})
使用将起作用,但语法错误。应该是:

db.collection.find({'docs.foo':{$nin:[1]})
使用操作员:

db.collection.find({'docs.foo': {$ne: 1}})
更新:我建议在这种情况下不要使用
$nin

{'docs.foo':{$ne:1}
获取
docs
的所有元素,并检查每个元素的
foo
字段是否等于1。如果找到匹配项,则从结果列表中丢弃该文档

{'docs.foo':{$nin:[1]}
获取
docs
的所有元素,并为每个元素检查其
foo
字段是否与数组的任何成员匹配
[1]
。这是一个,您将一个数组与另一个数组进行比较,每个元素与每个元素进行比较。虽然MongoDB可能很聪明并优化了此查询,但我假设您只使用
$nin
,因为“它与数组有关”.但是如果您了解您在这里所做的工作,您会意识到,
$nin
是多余的,并且可能具有低于标准的性能。

使用运算符:

db.collection.find({'docs.foo': {$ne: 1}})
更新:我建议在这种情况下不要使用
$nin

{'docs.foo':{$ne:1}
获取
docs
的所有元素,并检查每个元素的
foo
字段是否等于1。如果找到匹配项,则从结果列表中丢弃该文档


{'docs.foo':{$nin:[1]}
获取
docs
的所有元素,并为每个元素检查其
foo
字段是否与数组的任何成员匹配
[1]
。这是一个,您将一个数组与另一个数组进行比较,每个元素与每个元素进行比较。虽然MongoDB可能很聪明并优化了此查询,但我假设您只使用
$nin
,因为“它与数组有关”但是如果你明白你在这里做什么,你就会意识到,
$nin
是多余的,并且可能有低于标准的性能。

奇怪的是,为什么
$nin
而不是
$ne
?你不能做
db.collection.find({docs.foo':{$ne:1}})
?(也就是说,同样的事情,但不需要1在一个数组中,如中)@Tcizzle Yep,
$ne
如果只有一个值也可以。
$ne
也应该更高效(更快)好奇,为什么
$nin
而不是
$ne
?你不能执行
db.collection.find({'docs.foo':{$ne:1})
(也就是说,同样的事情,但不需要1在数组中,如中)@tscizzle是的,
$ne
如果只有一个值也可以。
$ne
也应该更有效率(更快)这是一个只有一个元素的数组的笛卡尔积:不确定这种情况下的性能命中率有多高。我们必须制定一个基准。这是一个只有一个元素的数组的笛卡尔积:不确定这种情况下的性能命中率有多高。我们必须制定一个基准。