你如何查询“不空”在蒙戈?你如何查询“不空”在蒙戈?(How do you query for “i

2019-05-12 18:40发布

我想执行以下查询:

db.mycollection.find(HAS IMAGE URL)

什么应该是正确的语法?

Answer 1:

这将返回所有文件与一个名为“IMAGE URL”键,但他们仍然可以有一个空值。

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

这将返回所有文档都与所谓的“IMAGE URL”键非空值。

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

此外,根据文档,$当前存在不能使用索引,但$ 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":{$ne:null}});

这将只返回第二和第三个文件:

db.test.find({"check":null})


Answer 2:

在你可以使用pymongo:

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

由于pymongo代表蒙戈“空”为蟒蛇“无”。



Answer 3:

一个内胆是最好的:

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

这里,

MyCollection的 :把你想要的集合名称

字段名 :把你想要的字段名称

阐释:

$存在 :如果是真的,$存在包含字段,包括在字段值为空文件的文件相匹配。 如果是假的,查询只返回不包含该领域的文件。

$ NE选择的文件,其中字段的值不等于指定的值。 这包括不包含字段的文档。

所以在你下面的查询会与IMAGEURL领域存在且具有不空值返回所有文档中提供的情况:

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


Answer 4:

db.collection_name.find({"filed_name":{$exists:true}});

取,即使含有这种filed_name是空文件。

我的建议:

db.collection_name.find({"field_name":{$type:2}}) //type:2 == String

您可以检查所需的属性的类型,它会返回所有的查询FIELD_NAME包含的值,因为你是在提交的其他类型检查,如果它是空的类型条件不符所以没有将返回文档。

注意 :如果FIELD_NAME有一个空字符串,它的意思是“”,这将是returned.It是相同的行为db.collection_name.find({"filed_name":{$ne:null}});

额外的验证:

好了,所以我们还没有完成,我们需要一个额外的条件。

db.collection_name. find({ "field_name":{$type:2},$where:"this.field_name.length >0"})

要么

db.collection_name. find({ "field_name":{$ne:null},$where:"this.field_name.length >0"})

参考所有类型: https://docs.mongodb.com/manual/reference/operator/query/type/#op._S_type



Answer 5:

分享对未来的读者。

该查询为我们工作(查询从执行MongoDB的指南针 ):

{
  "fieldName": {
    "$nin": [
      "",
      null
    ]
  }
}


Answer 6:

尚未提及的一个替代方案,但可能是一些更有效的选择(不能与NULL项工作)是使用稀疏索引 (条目索引时,有在现场的东西只存在)。 下面是一个示例数据集:

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" }
{  }
{  }

OK,所以没有多余的文件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()

db.foo.find({}, {_id : 0, imageUrl : 1}).hint({imageUrl : 1})
{ "imageUrl" : "http://example.com/bar.jpg" }
{ "imageUrl" : "http://example.com/bar.png" }
{ "imageUrl" : "http://example.com/foo.jpg" }
{ "imageUrl" : "http://example.com/foo.png" }

还有就是我们所期待的结果 - 只与外地人口返回文档。 这也只使用索引(即它是一个覆盖索引查询),所以只索引需要在内存中返回结果。

这是一个专门使用的情况下,不能普遍使用(请参阅这些选项的其他答案)。 尤其应该指出的是,就当前情况来看,你不能使用count()以这种方式(如我将返回6不是4),所以请只在适当的时候使用。



Answer 7:

db.<collectionName>.find({"IMAGE URL":{"$exists":"true"}, "IMAGE URL": {$ne: null}})


Answer 8:

该查询将被

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

它将返回有“图像URL”作为重点的所有文件...........



文章来源: How do you query for “is not null” in Mongo?