你如何在Mongo中查询这个? (不为空)

db.mycollection.find(HAS IMAGE URL) 

这将返回所有具有名为“IMAGE URL”的键的文档,但是它们仍可能具有空值。

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

这将返回所有具有名为“IMAGE URL” 非空值的文档的文档。

 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.collection_name.find({"filed_name":{$exists:true}});

获取包含这个字段的文档,即使它是空的。

我的主张:

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

你可以检查所需的属性types,它将返回所有的文件,其field_name查询包含一个值,因为你正在检查的字段types,否则,如果它为空的types条件不匹配,所以什么都不会返回。

:如果field_name有一个空string,意思是“”,它将被返回。这是相同的行为为db.collection_name.find({"filed_name":{$ne:null}});

额外的validation:

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

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

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

一个没有提到的替代方法,但是对于一些替代方法(对于NULL条目不起作用)可能是一个更高效的select,就是使用稀疏索引 ( 索引中的条目仅在字段中有某些内容时才存在)。 这是一个示例数据集:

 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字段上创build稀疏索引:

 db.foo.ensureIndex( { "imageUrl": 1 }, { sparse: true } ) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 } 

现在,总是有一个机会(特别是对于像我的示例一样的小数据集),而不是使用索引,MongoDB将使用表扫描,即使对于潜在的覆盖索引查询。 事实certificate,这给我一个简单的方法来说明这里的区别:

 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),所以请仅在适当的时候使用。

查询将会是

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

它将返回所有具有“图像URL”作为关键的文件………..