我想执行以下查询:
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})
$ne
可以包含不包含该字段的文档。自您发布答案以来,这个情况有变化吗?http://docs.mongodb.org/manual/reference/operator/query/ne/ - Andrew Mao一句话简介最好:
db.mycollection.find({ 'fieldname' : { $exists: true, $ne: null } });
在这里,
mycollection:填写您所需的集合名称
fieldname:填写您所需的字段名称
说明:
$exists:当 为true时,$exists匹配包含该字段的文档,包括字段值为null的文档。如果 为false,则查询仅返回不包含该字段的文档。
$ne:选择字段值与指定值不相等的文档,包括不包含该字段的文档。
因此,在您提供的情况下,以下查询将返回所有具有imageurl字段存在且值不为空的文档:
db.mycollection.find({ 'imageurl' : { $exists: true, $ne: null } });
$exists: true
是多余的, $ne: null
就足够了。 - Stanislav Karakhanov$exists: true
也会返回null
值。必须同时使用$exists: true
和$ne: null
。这不是冗余的。 - Ismail Kattakath$ne: null
使 $exists: true
生效!因为 $exists: true
返回 null
值,而 $ne: null
过滤掉这些值,所以你只需要使用 $ne: null
。 - jessepinhodb.collection_name.find({"filed_name":{$exists:true}});
获取包含此字段名称的文档,即使它为null。
警告
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.mycollection.find({"IMAGE URL":{"$ne":None}});
因为 pymongo 把 mongo 的 null
表示为 python 的 None
。
db.users.find({$and: [{"name" : {$nin: ["", null]}}, {"name" : {$exists: true}}]})
{ 'column_name': { $exists: true } }
db.<collectionName>.find({"IMAGE URL":{"$exists":"true"}, "IMAGE URL": {$ne: 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 }
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()
(对于我的示例,它将返回6而不是4),因此请仅在适当时使用。您可以使用 $and 和 $exists 与 $nin 一起,以查找键的非空值的情况。
use dbname db.collectionname.find({$and : [{key : {$exists : true}},{$nin : [null,'',undefined]}]});
因为值可以存在或不存在。 对于这种情况,$exists 可用于检查该值。而对于值存在的情况下检查其详细信息,则使用 $nin 来排除 undefined、null 和空字符串。
{ field : {$ne : null} }
是用来检查非空值的。 http://docs.mongodb.org/manual/reference/operator/query/ne/ - Jaider