gpt4 book ai didi

mongodb - 聚合/项目子文档作为 mongo 中的顶级文档

转载 作者:IT老高 更新时间:2023-10-28 13:12:56 25 4
gpt4 key购买 nike

在我的一个集合中执行了几个聚合步骤(管道步骤)后,我得到了以下结果:

{
"_id" : ObjectId("574e7722bffe901713d383bb"),
"eventname" : "Ball Passed",
"command" : {
"_id" : ObjectId("57ec6b6f6c61e919b578fe7c"),
"name" : "Run",
"strike" : 15,
"score" : true,
"duration" : 123
}
}
{
"_id" : ObjectId("57ec6b6f6c61e919b578ff8a"),
"eventname" : "Ball Passed",
"command" : {
"_id" : ObjectId("573d688d080cc2cbe8aecbbc"),
"name" : "Run",
"strike" : 12,
"score" : false,
"duration" : 597
}
}

这很好!

但是,在聚合的下一步中,我希望得到以下结果:

{
"_id" : ObjectId("57ec6b6f6c61e919b578fe7c"),
"name" : "Run",
"strike" : 15,
"duration" : 123
}
{
"_id" : ObjectId("573d688d080cc2cbe8aecbbc"),
"name" : "Run",
"strike" : 12,
"duration" : 597
}

如果你注意到了,command 字段应该成为顶级文档,command.score 应该被跳过。

如何一步完成?如果这在一个步骤中是不可能的,那么在多个步骤中呢?我想我必须使用 $project

最佳答案

如果子文档中有很多很多字段,并且偶尔会使用新字段进行更新,那么投影就不是一个可行的选择。幸运的是,从 3.4 开始,MongoDB 有了一个名为 $replaceRoot 的新运算符。

您所要做的就是在管道末端添加一个新阶段。

db.getCollection('sample').aggregate([
{
$replaceRoot: {newRoot: "$command"}
},
{
$project: {score: 0 } //exclude score field
}
])

这会给你想要的输出。

请注意,在聚合的情况下(尤其是在 $group 阶段之后),“命令”文档可以是一个数组,并且可以包含多个文档。在这种情况下,您需要 $unwind 数组首先可以使用 $replaceRoot

关于mongodb - 聚合/项目子文档作为 mongo 中的顶级文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39968790/

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