我确信我在MongoDB查询中遗漏了一些非常基本的东西,似乎无法得到这个简单的条件。
考虑这个集合
> db.tests.find()
{ "_id" : ObjectId("..."), "name" : "Test1" , "deleted" : true}
{ "_id" : ObjectId("..."), "name" : "Test2" , "deleted" : false}
{ "_id" : ObjectId("..."), "name" : "Test3" }
我只想查询所有“未删除”的项目
我知道如何查找“已删除”标志设置为true的项目:
> db.tests.find({deleted:true})
{ "_id" : ObjectId("..."), "name" : "Test1" , "deleted" : true}
但是如何查找所有未被“删除”
(例如,否定上述查询,或者换句话说,任何没有“已删除”
字段的项目,或者具有值false
我通过猜测尝试了什么(请不要笑...)
> db.tests.find({$not : {deleted: true}})
(不返回任何结果)
> db.tests.find({$not : {$eq:{deleted:true}}})
错误:{“$err”:“无效运算符:$eq”,“代码”:10068}
> db.tests.find({deleted:{$not: true}})
错误:{“$err”:“无效使用$not”,“代码”:13041}
> db.tests.find({deleted:{$not: {$eq:true}}})
错误:{“$err”:“无效使用$not”,“代码”:13034}
我错过了什么?
强尼克有最好的答案。选择器中的$是最短、最干净的IMO。
这将测试“假”或“不存在”。并且可以被索引。
db.tests.find({$or:[{deleted:false},{deleted:{$exists:false}}]})
使用索引的示例。
((function(){
print("creating collection 'testx' and inserting 50 trues, 50 falses, 50 non-existents");
db.testx.drop();
db.testx.ensureIndex({deleted:1});
for (var i=0;i<50;i++){
db.testx.insert({i:i,deleted:false});
};
for (var i=0;i<50;i++){
db.testx.insert({i:i,deleted:true});
};
for (var i=0;i<50;i++){
db.testx.insert({i:i});
};
var res0 = db.testx.find().explain();
var res1 = db.testx.find({deleted:false}).explain();
var res2 = db.testx.find({deleted:true}).explain();
var res3 = db.testx.find({deleted:{$exists:false}}).explain();
var res4 = db.testx.find({$or:[{deleted:false},{deleted:{$exists:false}}]}).explain();
var res5 = db.testx.find({$or:[{deleted:true},{deleted:{$exists:false}}]}).explain();
var res6 = db.testx.find({deleted:{$in:[false,null]}}).explain();
print("res0: all objects ("+res0["n"]+" found, "+res0["nscannedObjects"]+" scanned)");
print("res1: deleted is false ("+res1["n"]+" found, "+res1["nscannedObjects"]+" scanned)");
print("res2: deleted is true ("+res2["n"]+" found, "+res2["nscannedObjects"]+" scanned)");
print("res3: deleted is non-existent ("+res3["n"]+" found, "+res3["nscannedObjects"]+" scanned)");
print("res4: deleted is false or non-existent ("+res4["n"]+" found, "+res4["nscannedObjects"]+" scanned)");
print("res5: deleted is true or non-existent ("+res5["n"]+" found, "+res5["nscannedObjects"]+" scanned)");
print("res6: deleted is in [false,null] ("+res5["n"]+" found, "+res5["nscannedObjects"]+" scanned)");
})())
这应该打印出来
creating collection 'testx' and inserting 50 trues, 50 falses, 50 non-existents
res0: all objects (150 found, 150 scanned)
res1: deleted is false (50 found, 50 scanned)
res2: deleted is true (50 found, 50 scanned)
res3: deleted is non-existent (50 found, 50 scanned)
res4: deleted is false or non-existent (100 found, 100 scanned)
res5: deleted is true or non-existent (100 found, 100 scanned)
res6: deleted is in [false,null] (100 found, 100 scanned)
为完整起见,另一种方法是使用$in
:
js prettyprint-override">db.test.find({deleted: {$in: [null, false]}})
将null
包含在数组中会拉入缺少deleted
字段的文档。此查询可以使用当前2.6版本中{deleted:1}
上的索引。6 MongoDB发布。
db.tests.find({deleted: {$ne: true}})
其中,$ne
表示“不相等”。(关于mongodb运营商的文档)
我有一个非常特别的问题,关于查询嵌套到数组字段的布尔字段和字符串字段。索引映射如下所示: 文档索引还有许多其他字段,这些字段没有嵌套到数组字段中,但必须包含在查询字段中。我尝试了一种使用过滤器和布尔查询的方法,如下所示: 这个查询的问题是,它返回的文档在我看来不必返回。在这种情况下,文件如下所示: 您可以注意到,array_field_1的第三项包含boolean_field_2:false和正在
本文向大家介绍选择MongoDB文档,其中字段不存在,为null或为false?,包括了选择MongoDB文档,其中字段不存在,为null或为false?的使用技巧和注意事项,需要的朋友参考一下 您可以为此使用$in运算符。让我们首先用文档创建一个集合。使用文档创建集合的查询如下- 在method的帮助下显示集合中的所有文档。查询如下- 以下是输出和减号 这是查询以选择其中不存在字段,为null或
我对Bool查询和在elasticsearch中查找精确值有点困惑。具体来说,我有一个title_field和post_field,我想搜索。但是我使用的所有其他字段,因为我想查找它们是否存在或不存在,或者有多少次(如网址或用户名,必须是准确的)。 因此,我可以从文档中看到,我可以对title_字段和post_字段进行多重匹配查询。 但我希望得到确切答复的其他领域呢?我是否执行布尔查询(使用mus
问题内容: 我创建了一个带有复选框的简单页面: 该URL两次用MyCheckBox值填充!因此: 如果复选框为true,则仅重复该值。如果设置为false,它将仅在查询字符串中出现一次。 上面的代码得到了简化,因为我在窗体上有几个下拉菜单和一个文本框,它们可以正常工作。我认为我从这个问题中遗漏的代码没有什么异常之处。 是否有人在查询字符串参数重复方面有类似的问题? 问题答案: 此行为是设计使然的复
我在这里遵循指南https://dzone.com/articles/23-usplient-ellasticsearch-example-queries,下面的bool查询让我感到困惑: 根据教程,查询的解释是: 搜索标题中有“ellasticsearch”或“solr”字样的书,由“Clinton Gormley”撰写,但不由“Radu Gheorge”撰写 我的问题是,bool查询中有3个条