gpt4 book ai didi

mongodb - Mongodb AddToSet 多个对象到一个数组

转载 作者:可可西里 更新时间:2023-11-01 10:15:40 26 4
gpt4 key购买 nike

在 Mongo 中聚合时,我尝试使用 $addToSet 将多个对象添加到单个数组。

数据的格式可能不是最好的,但我没有能力改变它。以下是我正在查询的文档类型的示例:

{
"question" : "How tall is the CN Tower?",
"answer" : "553.3 metres",
"user": "user_1"
"information" : {
"info_details" : {
"info_1" : {
"score" : 23,
"size" : 855,
"total" : 29,
},
"info_2" : {
"score" : 1234,
"size" : 1000,
"total" : 3,
"index" : "index_1",
"rank" : 1
}
}
}
}

下面是一个示例查询(省略了项目部分)。虽然双 $addToSet 不起作用,但我把它放在那里,因为它显示了我想在逻辑上完成的事情。请注意,这两个信息对象可能具有不同的字段和值。

...{
"$group": {
"_id": {
"question": "$doc.questionId",
"answer": "$doc.answerCandidateId",
"user": "$doc.user"
},
"info": {
"$addToSet": {
"score": "$doc.information.info_details.info_1.score",
"size": "$doc.information.info_details.info_1.size",
"total": "$doc.information.info_details.info_1.total"
},

// This second addToSet overwrites the first info value (does not work as I want it to)
"info": {
"$addToSet": {
"score": "$doc.information.info_details.info_2.score",
"size": "$doc.information.info_details.info_2.size",
"total": "$doc.information.info_details.info_2.total",
"index": "$doc.information.info_details.info_2.index",
"rank": "$doc.information.info_details.info_2.rank"
}
}
}
}
}

我的目标是使用 $group 操作中的所有信息对象(减去重复项)设置一个“信息”。

{
"question": "question_1",
"answer": "answer_1",
"user": "user_1",
"info": [ {"score": 23, "size": 855, "total": 29}, {"score": 1234, "size": 1000, "total": 3, "index": "index_1", "rank": 1}]
}

有没有办法将 $group 操作中的多个对象添加到同一个集合?

最佳答案

您可以尝试以下基于 mongo 版本的解决方案。

这里的想法是将动态键更改为带标签的键值结构,即将嵌入式文档 info_1 & info_2 更改为嵌入式数组,然后是 $unwind & $组

Mongo 版本 3.4

您可以使用$objectToArrays 运算符将嵌入式文档转换为嵌入式数组。

db.collection.aggregate({
$addFields: {
information: {
$objectToArray: "$information.info_details"
}
}
}, {
$unwind: "$information"
}, {
$group: {
_id: {
question: "$question",
answer: "$answer",
user: "$user"
},
info: {
$addToSet: "$information.v"
}
}
})

Mongo 版本 3.2

您可以使用[] 括号来做一些类似于将嵌入文档转换为嵌入数组的事情。

db.collection.aggregate({
$project: {
question: 1,
answer: 1,
user: 1,
information: ["$information.info_details.info_1", "$information.info_details.info_2"]
}
}, {
$unwind: "$information"
}, {
$group: {
_id: {
question: "$question",
answer: "$answer",
user: "$user"
},
info: {
$addToSet: "$information"
}
}
})

关于mongodb - Mongodb AddToSet 多个对象到一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43747366/

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