gpt4 book ai didi

MongoDB:聚合并展平数组字段

转载 作者:可可西里 更新时间:2023-11-01 09:26:00 27 4
gpt4 key购买 nike

在使用关系数据库(SQL Server、MySQL、Oracle、Informix)28 年后,我转向了 MongoDB。过去两周进展缓慢。我想提交几个问题来确认我的想法。

我的文档如下所示(忽略此问题的分组):

{
"_id": "xyz-800",
"site": "xyz",
"user": 800,
"timepoints": [
{"timepoint": 0, "a": 1500, "b": 700},
{"timepoint": 2, "a": 1000, "b": 200},
{"timepoint": 4, "a": 3500, "b": 1500}
],
"groupings": [
{"type": "MNO", "group": "<10%", "raw": "1"},
{"type": "IJK", "group": "Moderate", "raw": "23"}
]
}

我想展平时间点嵌套数组。以下是有效的,但是有没有办法在时间点中通配属性而不是列出每个属性?原因可能是如果一个新属性(例如,'c')被添加到子文档中,那么我必须修改代码,或者如果这个子文档有很多属性我需要列出每个属性而不是使用通配符,如果可能。

db.records.aggregate( {$unwind : "$timepoints"}, 
{$project: {_id: 1, site: 1, user: 1,
'timepoint': '$timepoints.timepoint',
'a': '$timepoints.a',
'b': '$timepoints.b'}})

结果:

{"id":"xyz-800", "site":"xyz", "user":800, "timepoint": 0, "a":1500, "b":700}
{"id":"xyz-800", "site":"xyz", "user":800, "timepoint": 2, "a":1000, "b":200}
{"id":"xyz-800", "site":"xyz", "user":800, "timepoint": 4, "a":3500, "b":1500}

我目前使用的是 MongoDB 3.2

最佳答案

启动MongoDb 3.4,我们可以使用 $addFields 将顶级字段添加到嵌入文档并使用 $replaceRoot 将嵌入式文档提升到顶层。

db.records.aggregate({
$unwind: "$timepoints"
}, {
$addFields: {
"timepoints._id": "$_id",
"timepoints.site": "$site",
"timepoints.user": "$user"
}
}, {
$replaceRoot: {
newRoot: "$timepoints"
}
})

示例输出

{ "timepoint" : 0, "a" : 1500, "b" : 700, "_id" : "xyz-800", "site" : "xyz", "user" : 800 }
{ "timepoint" : 2, "a" : 1000, "b" : 200, "_id" : "xyz-800", "site" : "xyz", "user" : 800 }
{ "timepoint" : 4, "a" : 3500, "b" : 1500, "_id" : "xyz-800", "site" : "xyz", "user" : 800 }

关于MongoDB:聚合并展平数组字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40833926/

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