gpt4 book ai didi

mongodb - 获取原始文档字段作为聚合结果的一部分

转载 作者:IT老高 更新时间:2023-10-28 13:35:27 26 4
gpt4 key购买 nike

我想在我的汇总结果中获取所有文档字段,但是一旦我使用 $group,它们就消失了。使用 $project 可以让我读取我在 $group 中定义的任何字段,但在获取其他字段时没有运气:

var doc = {
_id: '123',
name: 'Bob',
comments: [],
attendances: [{
answer: 'yes'
}, {
answer: 'no'
}]
}

aggregate({
$unwind: '$attendances'
}, {
$match: {
"attendances.answer": { $ne:"no" }
}
}, {
$group: {
_id: '$_id',
attendances: { $sum: 1 },
comments: { $sum: { $size: { $ifNull: [ "$comments", [] ] }}}
}
}, {
$project: {
comments: 1,
}
}

这会导致:

[{
_id: 5317b771b6504bd4a32395be,
comments: 12
},{
_id: 53349213cb41af00009a94d0,
comments: 0
}]

如何在其中获取“名称”?我尝试将 $group 添加为:

name: '$name'

以及在 $project 中:

name: 1

但两者都行不通

最佳答案

您不能投影在 $group 操作期间删除的字段。

由于您按原始文档 _id 进行分组,并且只有一个 name 值,因此您可以使用 $first 保留 name 字段:

db.sample.aggregate(
{ $group: {
_id: '$_id',
comments: { $sum: { $size: { $ifNull: [ "$comments", [] ] }}},
name: { $first: "$name" }
}}
)

示例输出为: { "_id": "123", "comments": 0, "name": "Bob"}

如果您要按可能保留多个值的条件进行分组,则应将 $push 放入 $group 中的数组中,或者如果您只需要唯一名称,则应使用 $addToSet

投影所有字段

如果您使用的是 MongoDB 2.6,并且想要获取 所有 的原始文档字段(不仅仅是 name)而不单独列出它们,您可以使用聚合变量 $$ROOT特定字段名称的位置。

关于mongodb - 获取原始文档字段作为聚合结果的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25108948/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com