mongodb - 你如何在Mongo中查询这个 ( 不为null )?


db.mycollection.find(HAS IMAGE URL)

时间:

这将返回所有名为"IMAGE URL"的文档,但是,它们仍然有一个空值。


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

这将返回所有带有key image和非空值的文档。


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":{$ne:null}});

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


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()来使用我们的稀疏索引:


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(),所以,只要适当的时候使用。

查询将是


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

它将返回所有具有"IMAGE URL"的文档作为key ..........

...