您如何在Mongo中查询“不为空”?

元气小坏坏 提交于 2020-02-28 01:06:16

我想执行以下查询:

db.mycollection.find(HAS IMAGE URL)

正确的语法应该是什么?


#1楼

在pymongo中,您可以使用:

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

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


#2楼

尚未提及的替代方法,但是对于某些方法(不适用于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总是有机会(尤其是像我的示例这样的小数据集)而不是使用索引,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()稀疏索引:

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),因此请仅在适当时使用。


#3楼

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

提取包含此filed_name的文档,即使它为null。

我的主张:

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

您可以检查所需属性的类型,它将返回所查询的field_name包含值的所有文档,因为您正在检查文件的类型,否则,如果它为null,则类型条件不匹配,因此将不返回任何内容。

Nb :如果field_name有一个空字符串,表示“”,它将被返回。这与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


#4楼

查询将是

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

它将返回所有以“ IMAGE URL”为键的文档.........


#5楼

分享给未来的读者。

此查询对我们有用 (从MongoDB罗盘执行的查询):

{
  "fieldName": {
    "$nin": [
      "",
      null
    ]
  }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!