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

MongoDB-创建一个布尔字段来测试某个子字段的存在[重复]

姜鹏程
2023-03-14

$project阶段,我希望创建一个虚拟(布尔)字段,该字段如下:

    null
{ 
    "_id" : "1", 
    "name" : "John", 
    "address" : {
        "city" : "New York", 
        "country" : "USA"
    }
}
{ 
    "_id" : "2", 
    "name" : "Paul", 
    "address" : {
        "city" : "Paris"
    }
}

以下是我所尝试的:

db.getCollection("items").aggregate(
    [
        { 
            "$match" : {

            }
        },
        {
            "$project": {
                "name": true,
                "has_country": { "$address.country": { "$exists": true } }
            }
        }
    ]
);

此操作失败,原因是InvalidPipelineOperator和消息无法识别表达式'$address.country'。我在这里找到了问题,但这个用例略有不同,答案不是很容易理解。

共有1个答案

尉迟招
2023-03-14

将子字段与null进行比较,可以达到以下目的:

db.getCollection("items").aggregate(
    [
        { 
            "$match" : {

            }
        },
        {
            "$project": {
                "name": true,
                "has_country": { "$gt": [ "$address.country", null ] }
            }
        }
    ]
);

对于所提到的数据,将返回以下内容:

{ 
    "_id" : "1", 
    "name" : "John", 
    "has_country" : true
}
{ 
    "_id" : "2", 
    "name" : "Paul", 
    "has_country" : false
}
 类似资料:
  • 示例: 这两个序列必须匹配。

  • 问题内容: 这可能是一个非常愚蠢的问题,但是对数据库表中的布尔字段建立索引是否会有很多好处? 在常见情况下,例如标记为“无效”的“软删除”记录,因此大多数查询都包含,这将有助于对该字段进行单独索引,还是应将其与其他常见搜索字段组合在一起?不同的索引? 问题答案: 没有。 您可以对要搜索的字段具有较高的选择性/基数进行索引。几乎所有表都消除了布尔字段的基数。如果有的话,它将使您的写入速度变慢(降低的

  • 我们已经将Findbugs配置为通过Maven在Jenkins上运行。 除其他外,它抱怨以下代码行SE_BAD_FIELD: 这个bug的描述是 Se:可序列化类中的非瞬态非可序列化实例字段(Se\u BAD\u字段) 这个可序列化类定义了一个非原语实例字段,它既不是瞬态的、可序列化的,也不是java的。并且似乎没有实现可外部化的接口或readObject()和writeObject()方法。如果

  • 问题内容: 我的愿望是搜索存在field_a而不存在fields_b的文档。有没有一种方法可以使用Kibana中的Lucene查询语法(Kibana的Discover部分中的Search字段)进行此操作。 我尝试使用 __missing_:field_b_ 失败( __exists_可行_ )。 我发现了这一点,但并没有太大帮助: 问题答案: 对于lucene搜索语法: 对于elasticsear

  • 我只看到两种方法: 将所有字段设置为受保护(或包可见性) 为所有字段生成50个getter 创建50个委托方法来获取这些字段的状态,而不是整个对象的状态 在正常情况下,我会选择最后一个(尽管我真的不想仅仅出于测试的原因而改变界面)。但是在我的类中编写50个新方法只是为了测试真的有意义吗?在这种情况下,将字段设置为受保护的不是更好吗,因为有这么多方法,类会变得不清楚? 注意。反射是我想使用的最后一个