基于共享密钥聚合多个对象数组的MongoDB
我正在编写一个查询,为数据库中的每个用户计算多个指标 我已经计算了所有的指标,并且有一个这样的结构基于共享密钥聚合多个对象数组的MongoDB,mongodb,nosql,Mongodb,Nosql,我正在编写一个查询,为数据库中的每个用户计算多个指标 我已经计算了所有的指标,并且有一个这样的结构 { "metric1": [{"user_id": 1, "val": 13},{"user_id": 2, "val": 100}], "metric2": [{"user_id": 2, "val": 29},{"user_id": 1, "val": 123}], "metric3": [{"user_id": 1, "val": 46},{"user_id": 2, "va
{
"metric1": [{"user_id": 1, "val": 13},{"user_id": 2, "val": 100}],
"metric2": [{"user_id": 2, "val": 29},{"user_id": 1, "val": 123}],
"metric3": [{"user_id": 1, "val": 46},{"user_id": 2, "val": 111]
}
我试图将上面的内容转换成这个结构
{
"user_id": [1,2],
"metric1": [13, 100],
"metric2": [29,123],
"metric3": [46,111]
}
因此,我可以显示一个表格,显示每个用户和三个指标(每列一个指标,每行一个用户)。考虑到您的数据就是您所说的:
{
"metric1": [
{"id1": 1}, {"id2": 2}
],
"metric2": [
{"id2": 22}, {"id1": 11}
],
"metric3": [
{"id2": 222}, {"id1": 111}
]
}
您所要做的就是使用$unwind
来中断阵列,然后$objectToArray
来访问密钥
db.blah.aggregate([
{ $unwind: '$metric1' },
{ $unwind: '$metric2' },
{ $unwind: '$metric3' },
{ $project: {'metric1': { $objectToArray: '$metric1' }, 'metric2': { $objectToArray: '$metric2' }, 'metric3': { $objectToArray: '$metric3' }} },
{ $sort: { 'metric1.k' : -1} },
{ $sort: { 'metric2.k' : -1} },
{ $sort: { 'metric3.k' : -1} },
{ $unwind: '$metric1' },
{ $unwind: '$metric2' },
{ $unwind: '$metric3' },
{ $group: {
_id: null,
user_id: { $addToSet: '$metric1.k' },
metric1: { $addToSet: '$metric1.v' },
metric2: { $addToSet: '$metric2.v' },
metric3: { $addToSet: '$metric3.v' },
} },
{ $project: { _id: 0 } }
]).pretty()
结果是什么
{
"user_id" : [
"id1",
"id2"
],
"metric1" : [
1,
2
],
"metric2" : [
11,
22
],
"metric3" : [
111,
222
]
}
请共享集合看起来您的输入文档不是文档或JSON格式。您将需要一个格式正确的输入文档来处理MongoDB查询。我的问题没有说清楚,我的不好。我更新了问题,使之更简洁。您的解决方案很有意义,现在我只是尝试将数据转换为您开始使用的格式。