当前位置: 首页 > 知识库问答 >
问题:

查询布尔字段为"not true"(例如false或不存在)

巫经义
2023-03-14

我确信我在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}

我错过了什么?

共有3个答案

萧鸿轩
2023-03-14

强尼克有最好的答案。选择器中的$是最短、最干净的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)

朱浩大
2023-03-14

为完整起见,另一种方法是使用$in

js prettyprint-override">db.test.find({deleted: {$in: [null, false]}})

null包含在数组中会拉入缺少deleted字段的文档。此查询可以使用当前2.6版本中{deleted:1}上的索引。6 MongoDB发布。

督辉
2023-03-14
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个条