假设我有一个用户集合。每个用户都有资产。我想对资产进行一些统计度量。但是,为了能够做到这一点,我只需要将投影中的资产作为聚合的输入。如何才能做到这一点?
我希望能够对资产进行大量的聚合操作。这些操作将包括过滤、限制和跳过,因此我将使用诸如$skip、$match、$limit等运算符。但是,为了对嵌入式数组执行这些操作,我需要一个操作符,该操作符接受用户文档并输出嵌入到其中的资产数组。
我只想要一个操作符,该操作符接受具有以下模式的用户文档,并输出一个资产数组,然后对其执行聚合操作。
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'}
]
发布于 2018-05-02 06:09:13
这样做有两个步骤(加上$match
):
尝试:
db.users.aggregate([
{ $match: {_id: ObjectId("5ae837dca9a8e04dd0689824")} },
{ $unwind: "$assets" },
{ $replaceRoot: { newRoot: "$assets" } }
])
https://stackoverflow.com/questions/50123891
复制相似问题