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_Database_Nosql - Fatal编程技术网

Mongodb 您如何查询“报价”;“不为空”;在蒙哥?

Mongodb 您如何查询“报价”;“不为空”;在蒙哥?,mongodb,database,nosql,Mongodb,Database,Nosql,我想执行以下查询: db.mycollection.find(HAS IMAGE URL) 正确的语法应该是什么?查询将是 db.mycollection.find({"IMAGE URL":{"$exists":"true"}}) 它将返回所有以“图像URL”为键的文档……。这将返回所有以“图像URL”为键的文档,但它们可能仍然具有空值 db.mycollection.find({"IMAGE URL":{$exists:true}}); db.mycollectio

我想执行以下查询:

db.mycollection.find(HAS IMAGE URL)
正确的语法应该是什么?

查询将是

db.mycollection.find({"IMAGE URL":{"$exists":"true"}})

它将返回所有以“图像URL”为键的文档……。

这将返回所有以“图像URL”为键的文档,但它们可能仍然具有空值

db.mycollection.find({"IMAGE URL":{$exists:true}});
db.mycollection.find({"IMAGE URL":{$ne:null}});

这将返回所有文档,其中包含一个名为“IMAGE URL”的键和一个非空值

db.mycollection.find({"IMAGE URL":{$exists:true}});
db.mycollection.find({"IMAGE URL":{$ne:null}});
另外,根据文档,$exists当前不能使用索引,但$ne可以

编辑:由于对此答案感兴趣,因此添加了一些示例

鉴于这些插入:

db.test.insert({"num":1, "check":"check value"});
db.test.insert({"num":2, "check":null});
db.test.insert({"num":3});
这将返回所有三个文档:

db.test.find();
这将仅返回第一个和第二个文档:

db.test.find({"check":{$exists:true}});
db.test.find({"check":null})
这将仅返回第一个文档:

db.test.find({"check":{$ne:null}});
这将仅返回第二个和第三个文档:

db.test.find({"check":{$exists:true}});
db.test.find({"check":null})

在pymongo中,您可以使用:

db.mycollection.find({"IMAGE URL":{"$ne":None}});

因为pymongo将mongo的“null”表示为python的“None”

一个没有提到的替代方案,但对某些人来说可能是一个更有效的选择(不适用于空条目),就是使用(索引中的条目仅在字段中有内容时才存在)。以下是一个示例数据集:

db.foo.find()
{ "_id" : ObjectId("544540b31b5cf91c4893eb94"), "imageUrl" : "http://example.com/foo.jpg" }
{ "_id" : ObjectId("544540ba1b5cf91c4893eb95"), "imageUrl" : "http://example.com/bar.jpg" }
{ "_id" : ObjectId("544540c51b5cf91c4893eb96"), "imageUrl" : "http://example.com/foo.png" }
{ "_id" : ObjectId("544540c91b5cf91c4893eb97"), "imageUrl" : "http://example.com/bar.png" }
{ "_id" : ObjectId("544540ed1b5cf91c4893eb98"), "otherField" : 1 }
{ "_id" : ObjectId("544540f11b5cf91c4893eb99"), "otherField" : 2 }
现在,在imageUrl字段上创建稀疏索引:

db.foo.ensureIndex( { "imageUrl": 1 }, { sparse: true } )
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}
现在,MongoDB总是有机会(特别是对于像我的示例这样的小数据集)使用表扫描而不是索引,即使对于潜在的覆盖索引查询也是如此。事实证明,这给了我一个简单的方法来说明这里的区别:

db.foo.find({}, {_id : 0, imageUrl : 1})
{ "imageUrl" : "http://example.com/foo.jpg" }
{ "imageUrl" : "http://example.com/bar.jpg" }
{ "imageUrl" : "http://example.com/foo.png" }
{ "imageUrl" : "http://example.com/bar.png" }
{  }
{  }
好的,没有
imageUrl
的额外文档被返回,只是空的,不是我们想要的。为了确认原因,请解释一下:

db.foo.find({}, {_id : 0, imageUrl : 1}).explain()
{
    "cursor" : "BasicCursor",
    "isMultiKey" : false,
    "n" : 6,
    "nscannedObjects" : 6,
    "nscanned" : 6,
    "nscannedObjectsAllPlans" : 6,
    "nscannedAllPlans" : 6,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "server" : "localhost:31100",
    "filterSet" : false
}
因此,是的,
BasicCursor
等于表扫描,它没有使用索引。让我们强制查询使用稀疏索引和
hint()

这就是我们正在寻找的结果——只返回填充了字段的文档。这也只使用索引(即,它是一个覆盖索引查询),因此只有索引需要在内存中才能返回结果

这是一个专门的用例,不能普遍使用(请参阅这些选项的其他答案)。特别需要注意的是,目前情况下,您不能以这种方式使用
count()
(例如,它将返回6而不是4),因此请仅在适当时使用

db.collection_name.find({"filed_name":{$exists:true}});
获取包含此文件名的文档,即使它为空

警告

db.collection_name.find({"filed_name":{$ne:null}});
获取其字段_名称的值为$ne到null的文档,但该值也可以是空字符串

我的建议:

db.collection_name.find({ "field_name":{$ne:null},$where:"this.field_name.length >0"})
分享给未来的读者

此查询对我们有效(从以下位置执行查询):

db..find({“图像URL”:{“$exists”:“true”},“图像URL”:{$ne:null})

一个衬里是最好的:

db.mycollection.find({ 'fieldname' : { $exists: true, $ne: null } });
这里,

mycollection:放置所需的收藏名称

字段名:放置所需的字段名

解释:

$exists:为true时,$exists与包含字段的文档匹配,包括字段值为null的文档。如果为false,则查询仅返回不包含该字段的文档

$ne选择字段值不等于指定值的文档。这包括不包含该字段的文档

因此,在您提供的情况下,以下查询将返回imageurl字段存在且不具有空值的所有文档:

db.mycollection.find({ 'imageurl' : { $exists: true, $ne: null } });

在理想情况下,您希望测试所有三个(记录中不存在字段)

您可以执行以下操作

db.users.find({$and: [{"name" : {$nin: ["", null]}}, {"name" : {$exists: true}}]})

检查mongo compass中是否存在柱的最简单方法是:

{ 'column_name': { $exists: true } }

感谢您提供了一个解决方案,我注意到在MQL中,有时$ne:null不起作用,我们需要使用语法$ne:“”即,在上面示例的上下文中,我们需要使用db.mycollection.find({“IMAGE URL”:{“$ne”:“}”)-不确定为什么会发生这种情况,我已经在MongoDB论坛上发布了这个问题

以下是显示示例的快照:


根据文档,
$ne
包括不包含该字段的文档。自从你发布答案后,这种情况发生了变化吗?我认为这一点没有改变。检查$ne时,会在所有文档中检查该值,包括不包含该字段的文档,但$ne:null仍将与不包含该字段的文档不匹配,因为该字段的值仍然为null,即使该字段在该文档中不存在。如何匹配第二个文档?@River我在3年前写这篇文章时检查过,为了确定,我刚刚安装了Mongo并再次尝试。它仍然以同样的方式工作,答案是正确的。从第二个到最后一个查询只返回第一个文档。给出的示例使如何使用它变得非常容易理解。:-)简短回答:查询
{field:{$ne:null}}
检查notnull@kilianc是否为非真$exists也将捕获空值。请参阅“DORVAK”,这就是为什么它不能满足问题中的用例的原因。这个答案是错误的,因为<代码> $存在<代码> >检查密钥<代码>“图像URL”< /C> >并且不考虑它的值(<代码> null >代码>),并返回一个带有“代码>”图像URL“:NUL/<代码>的文档。文本字段总是稀疏索引,您不必显式地指定它。只有我的2美分。{$exists:true,$ne:null}没有显示正确的结果。您的查询工作得很好,请小心,$nin通常不会对索引进行优化这是一个有效的Json文档吗?查询文档中具有相同名称的两个属性。如果必须的话,不确定如何在内存中构建它。
$exists:true
是多余的,
$ne:null
就足够了。这应该是最好的答案
$exists:true
也返回
null
值。Th