如何在Mongo中的“根”上向数组添加元素

时间:2019-08-12 16:15:30

标签: mongodb aggregation

在mongo中,我在执行查询时会不断收集数据,然后使用group跟踪需要维护的属性。以我为例,患者记录具有大量数据,然后在我服药时,我必须将我需要保留的每个属性分组。

下面是一个例子。

{
        $group:{
            "_id":"$_id",
            "firstName":{$first:"$firstName"},
            "lastName":{$first:"$lastName"},
            "conditions":{$first:"$conditions"},
            "provider":{$first:"$provider"},
            "plans":{$first:"$plans"},
            "orgs":{$first:"$orgs"},
        }
    }

我要一直在做的是:

  { 
      $group: { _id: "$Id", results: { $first: '$$ROOT' } } ,
      $replaceRoot: { newRoot: '$results' } 
}

这似乎有些过分,但这是我找到“保持”完整患者信息的唯一途径。

是否有一种方法可以执行此操作而不必执行替换操作?

原因是我想将药物添加到患者记录中,而我可以使用第一种方法使用添加药物:

{
        $group:{
            "_id":"$_id",
            "firstName":{$first:"$firstName"},
            "lastName":{$first:"$lastName"},
            "conditions":{$first:"$conditions"},
            "provider":{$first:"$provider"},
            "plans":{$first:"$plans"},
            "orgs":{$first:"$orgs"},
            "medications":{
                $push:"$medications"
            }
        }
    }

我不能这样做:

{ 
      $group: { _id: "$Id", 
          results: { $first: '$$ROOT' },
          "medications":{
                $push:"$medications"
           }
           ,
      $replaceRoot: { newRoot: '$results' } 
}

但是在根上执行结果时,不允许添加“属性”。

对此有何建议?也许让$ group只是复制所有命名属性的经节?

1 个答案:

答案 0 :(得分:0)

您可以尝试以下方法:

   {
    $group: {
        _id: "$Id", "medications": {
            $push: "$medications"
        }, results: { $first: '$$ROOT' }
    } ,
    { $addFields: { 'results.medications': '$medications' } },
    $replaceRoot: { newRoot: '$results' }
}

但是这里的缺点是药物将是所有结果文档的数组,而不管基于组运算的多个值/单个/空(如果您不需要,则可以在addFields上使用cond操纵它)。