如何在mongo中使用聚合来在嵌入文档中的数组中进行操作?

时间:2018-05-01 21:12:13

标签: mongodb mongoose aggregation-framework mongoose-schema

我们假设我有用户的集合。每个用户都有资产。我想在资产上执行一些统计措施。但是为了能够做到这一点,我只需要在投影中将资产作为聚合的输入。怎么可以实现呢?

我希望能够对资产进行一系列汇总操作。这些操作包括过滤,限制和跳过,因此我将使用 $ skip $ match $ limit 等运营商。但是为了让我在嵌入式阵列上执行这些操作,我需要一个带有用户文档的运算符,并输出嵌入其中的 assets 数组。

简单地说,我希望运营商能够获取具有以下架构的用户文档,并输出一组资产,并进一步对其执行聚合操作。

user:{
   name: string,
   assets: Asset[],
   age: number
}

我尝试了这种聚合操作,但它没有按照我的预期工作。

db.getCollection('users').aggregate( [ 
{ $match: {_id: ObjectId("5ae837dca9a8e04dd0689824")} } ,
{ $project : { assets: 1  } },
] )

它输出一个数组,其中包含一个用户文档,其中资源嵌入其中,如此

[{
"_id" : ObjectId("5ae837dca9a8e04dd0689824"),
"assets" : [{_id:ObjectId("1"), assetName: 'tt' }, {_id : ObjectId("2"), assetName: 'rr'}]
}] 

我需要输出如下所示

[
{_id:ObjectId("1"), assetName: 'tt'}, 
{_id:ObjectId("2"), assetName: 'rr'}
]

1 个答案:

答案 0 :(得分:1)

执行此操作的两个步骤(加$match):

  • $unwind将子文档数组转换为具有一个子文档的多个文档
  • $replaceRoot将子文档提升为新根

尝试:

db.users.aggregate([
    { $match: {_id: ObjectId("5ae837dca9a8e04dd0689824")} },
    { $unwind: "$assets" },
    { $replaceRoot: { newRoot: "$assets" } }
])