在本文档中,“ 27”和“ 28”是一个月中的几天,而“ 27”下的“ 6”至“ 11”代表一天中的小时数
{
"values" : {
"27" : {
"6" : {
"users" : [
"5b5abc5ddd601f0b6681358a"
]
},
"7" : {
"users" : [
"5b5ac75cdd601f0b668157ff",
"5b5acd0ddd601f0b66816803"
]
},
"8" : {
"users" : [
"5b5acd0ddd601f0b66816803"
]
},
"9" : {
"users" : [
"5b5acd0ddd601f0b66816803",
"5b5ae89b781e011702f00812"
]
},
"10" : {
"users" : [
"5b5ae89b781e011702f00812"
]
}
},
"28" : {
"11" : {
"users" : [
"5b5abacadd601f0b6681312e"
]
}
}
}
}
我希望能够以两种方式查询它
首先作为{day: users-count}
例如:
{"27" : 7,
"28" : 1 }
,其他方式为{day : {hour : users-count}
示例:
{"27" : ["6" : 1,
"7" : 2,
"8" : 1,
"9" : 2,
"10": 1],
"28" : ["11" :1]}
将其用于预测和时间序列分析。
什么是明智且优化的方法?
答案 0 :(得分:1)
您可以尝试以下汇总
db.collection.aggregate([
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": {
"$map": {
"input": {
"$map": {
"input": { "$objectToArray": "$values" },
"as": "val",
"in": { "k": "$$val.k", "v": { "$objectToArray": "$$val.v" }}
}
},
"as": "val",
"in": {
"k": "$$val.k",
"v": {
"$sum": {
"$map": {
"input": "$$val.v",
"as": "v2",
"in": { "$size": "$$v2.v.users" }
}
}
}
}
}
}
}
}}
])
输出
[
{
"27": 7,
"28": 1
}
]
第二个输出
db.collection.aggregate([
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": {
"$map": {
"input": {
"$map": {
"input": { "$objectToArray": "$values" },
"as": "val",
"in": { "k": "$$val.k", "v": { "$objectToArray": "$$val.v" }}
}
},
"as": "val",
"in": {
"k": "$$val.k",
"v": {
"$arrayToObject": {
"$map": {
"input": "$$val.v",
"as": "v2",
"in": { "k": "$$v2.k", "v": { "$size": "$$v2.v.users" }}
}
}
}
}
}
}
}
}}
])
输出
[
{
"27": {
"10": 1,
"6": 1,
"7": 2,
"8": 1,
"9": 2
},
"28": {
"11": 1
}
}
]
另一个
db.collection.aggregate([
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": {
"$map": {
"input": {
"$map": {
"input": { "$objectToArray": "$values" },
"as": "val",
"in": {
"k": "$$val.k",
"v": { "$objectToArray": "$$val.v" }
}
}
},
"as": "val",
"in": {
"k": "$$val.k",
"v": [
{ "$arrayToObject": {
"$map": {
"input": "$$val.v",
"as": "v2",
"in": { "k": "$$v2.k", "v": { "$size": "$$v2.v.users" }}
}
}}
]
}
}
}
}
}}
])
输出
[
{
"27": [
{
"10": 1,
"6": 1,
"7": 2,
"8": 1,
"9": 2
}
],
"28": [
{
"11": 1
}
]
}
]