我想执行以下查询:
db.mycollection.find(HAS IMAGE URL)
什么应该是正确的语法?
我想执行以下查询:
db.mycollection.find(HAS IMAGE URL)
什么应该是正确的语法?
这将返回所有文件与一个名为“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})
在你可以使用pymongo:
db.mycollection.find({"IMAGE URL":{"$ne":None}});
由于pymongo代表蒙戈“空”为蟒蛇“无”。
一个内胆是最好的:
db.mycollection.find({ 'fieldname' : { $exists: true, $ne: null } });
这里,
MyCollection的 :把你想要的集合名称
字段名 :把你想要的字段名称
阐释:
$存在 :如果是真的,$存在包含字段,包括在字段值为空文件的文件相匹配。 如果是假的,查询只返回不包含该领域的文件。
$ NE选择的文件,其中字段的值不等于指定的值。 这包括不包含字段的文档。
所以在你下面的查询会与IMAGEURL领域存在且具有不空值返回所有文档中提供的情况:
db.mycollection.find({ 'imageurl' : { $exists: true, $ne: null } });
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
分享对未来的读者。
该查询为我们工作(查询从执行MongoDB的指南针 ):
{
"fieldName": {
"$nin": [
"",
null
]
}
}
尚未提及的一个替代方案,但可能是一些更有效的选择(不能与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),所以请只在适当的时候使用。
db.<collectionName>.find({"IMAGE URL":{"$exists":"true"}, "IMAGE URL": {$ne: null}})
该查询将被
db.mycollection.find({"IMAGE URL":{"$exists":"true"}})
它将返回有“图像URL”作为重点的所有文件...........