如果我有类似结构的文件如下。我正在使用计算结果更新它们,我想知道结果是否已经插入到文档中。让我们对每个文件说我运行计算' 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,因为计算结果是一个大的嵌入文档。
答案 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
}
}