【问题标题】:How to project whether field exists如何预测字段是否存在
【发布时间】:2016-08-02 12:25:48
【问题描述】:

如果我有类似以下结构的文档。我正在用计算结果更新它们,我想知道结果是否已经插入到文档中。假设我为每个文档运行计算“c”和计算“d”。现在我想显示所有文档的表格,并显示是否已经执行了计算“d”。对于这张表,我不关心计算'c'。

{
"_id":1
"a":1,
"resultsOfComputation":{
   "c":{large embedded document},
   "d":{large embedded document}   
   }
}

{
"_id":2
"a":1,
"resultsOfComputation":{
   "c":{large embedded document}
   }
}

我想得到一个结果,告诉我文档是否包含特定字段。例如,我想知道它是否包含字段“resultsOfComputation.d”,无论该字段的值是什么。

“resultsOfComputation.d”的查询结果示例如下:

{
"_id":1
"a":1,
"resultsOfComputation":{
   "d":true   
   }
}

{
"_id":2
"resultsOfComputation":{
   "d":false
   }
}

如果“resultsOfComputation.d”不在文档中,也可以是未定义的,这也可以:

{
"_id":1
"a":1,
"resultsOfComputation":{
   "d":true   
   }
}

{
"_id":2
"a":1,
"resultsOfComputation":{}
}

一般来说,我们的想法是获取文档的所有根元素,但仅针对所选(一个)计算结果的真/假/未定义,因为计算结果是一个大型嵌入式文档。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    运行以下聚合管道以获得所需的结果:

    db.collection.aggregate([
        {
            "$project": {
                "a": 1,
                "resultsOfComputation": {
                    "d": { "$gt": ["$resultsOfComputation.d", null] }   
                }
            }
        }
    ])
    

    样本输出

    /* 1 */
    {
        "_id" : 1,
        "a" : 1,
        "resultsOfComputation" : {
            "d" : true
        }
    }
    
    /* 2 */
    {
        "_id" : 2,
        "a" : 1,
        "resultsOfComputation" : {
            "d" : false
        }
    }
    

    【讨论】:

    • 这个查询让我大吃一惊!哇!哇!但是你能帮我理解一下,$gt 是如何给出真假输出的吗?
    • linked answer 说明了一切。
    • 这个答案有效,不幸的是,使用聚合对我来说很慢,尤其是当我将跳过添加到管道时。最后,我只是使用 find 而不是聚合,投影包含文档的所有根元素和一个我知道始终位于“resultsOfComputation.d”内的字段,然后我检查该字段是否未定义。
    猜你喜欢
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多