我有一个集合,其中每个文档都包含user_ids作为属性,这是一个Array字段。示例文档将是:
[{
_id: 'i3oi1u31o2yi12o3i1',
unique_prop: 33,
prop1: 'some string value',
prop2: 212,
user_ids: [1, 2, 3 ,4]
},
{
_id: 'i3oi1u88ffdfi12o3i1',
unique_prop: 34,
prop1: 'some string value',
prop2: 216,
user_ids: [2, 3 ,4]
},
{
_id: 'i3oi1u8834432ddsda12o3i1',
unique_prop: 35,
prop1: 'some string value',
prop2: 211,
user_ids: [2]
}]
我的目标是获得每个用户的文档数量,因此示例输出将为:
[
{user_id: 1, count: 1},
{user_id: 2, count: 3},
{user_id: 3, count: 2},
{user_id: 4, count: 2}
]
我尝试了几件没有效果的事情,最后我试过了:
aggregate([
{ $group: {
_id: { unique_prop: "$unique_prop"},
users: { "$addToSet": "$user_ids" },
count: { "$sum": 1 }
}}
]
但它只返回了每个文档的用户。我仍在努力学习任何资源或建议会有所帮助。
答案 0 :(得分:2)
您需要$unwind
" user_ids"数组并在$group
阶段计算每个" id"出现在收藏中。
db.collection.aggregate([
{ "$unwind": "$user_ids" },
{ "$group": { "_id": "$user_ids", "count": {"$sum": 1 }}}
])
答案 1 :(得分:0)
MongoDB聚合对集合中的文档中的值组执行计算,并通过在管道中执行其阶段来返回计算结果。
根据上述说明,请尝试在MongoDB shell中执行以下聚合查询。
db.collection.aggregate(
// Pipeline
[
// Stage 1
{
$unwind: "$user_ids"
},
// Stage 2
{
$group: {
_id:{user_id:'$user_ids'},
total:{$sum:1}
}
},
// Stage 3
{
$project: {
_id:0,
user_id:'$_id.user_id',
count:'$total'
}
},
]
);
在上面的聚合查询中,$ unwind运算符最初将每个文档的数组字段user_ids分解为数组字段的每个元素的多个文档,然后按照每个文档中包含的user_ids字段的值对文档进行分组,并对每个值执行文档求和of user_ids字段。