我们假设我有用户的集合。每个用户都有资产。我想在资产上执行一些统计措施。但是为了能够做到这一点,我只需要在投影中将资产作为聚合的输入。怎么可以实现呢?
我希望能够对资产进行一系列汇总操作。这些操作包括过滤,限制和跳过,因此我将使用 $ 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'}
]
答案 0 :(得分:1)
执行此操作的两个步骤(加$match
):
尝试:
db.users.aggregate([
{ $match: {_id: ObjectId("5ae837dca9a8e04dd0689824")} },
{ $unwind: "$assets" },
{ $replaceRoot: { newRoot: "$assets" } }
])