如何预测字段是否存在

时间:2016-08-02 12:25:48

标签: mongodb

如果我有类似结构的文件如下。我正在使用计算结果更新它们,我想知道结果是否已经插入到文档中。让我们对每个文件说我运行计算' c'和计算'。现在我想显示一个包含所有文档的表格,并显示计算是否为' 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":{}
}

通常,我们的想法是获取文档的所有根元素,但对于所选的(一个)计算结果只有true / false / undefined,因为计算结果是一个大的嵌入文档。

1 个答案:

答案 0 :(得分:4)

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

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
    }
}