英文:
Grouping MongoDB Data by Ignition Field Values: A Solution for Large Datasets
问题
{
"我想根据"ignition"字段的值对数据进行分组。如果"ignition"的值为1,则所有值为1的记录应该在遇到下一个值为0之前被分组在一起,依此类推。": "我想根据"ignition"字段的值对数据进行分组。如果"ignition"的值为1,则所有值为1的记录应该在遇到下一个值为0之前被分组在一起,依此类推。",
"我在MongoDB中有86400条记录,我想查询数据以实现所需的输出。": "我在MongoDB中有86400条记录,我想查询数据以实现所需的输出。",
"数据如下:": "数据如下:",
"[": "[",
"{": "{",
"ignition": "点火",
"1": "1",
",": ",",
"time": "时间",
"112": "112",
"193": "193",
"}": "}",
",": ",",
"{": "{",
"ignition": "点火",
"1": "1",
",": ",",
"time": "时间",
"193": "193",
"}": "}",
",": ",",
"{": "{",
"ignition": "点火",
"0": "0",
",": ",",
"time": "时间",
"115": "115",
"}": "}",
",": ",",
"{": "{",
"ignition": "点火",
"1": "1",
",": ",",
"time": "时间",
"116": "116",
"}": "}",
",": ",",
"{": "{",
"ignition": "点火",
"1": "1",
",": ",",
"time": "时间",
"117": "117",
"}": "}",
",": ",",
"{": "{",
"ignition": "点火",
"1": "1",
",": ",",
"time": "时间",
"118": "118",
"}": "}",
",": ",",
"{": "{",
"ignition": "点火",
"0": "0",
",": ",",
"time": "时间",
"119": "119",
"}": "}",
",": ",",
"{": "{",
"ignition": "点火",
"1": "1",
",": ",",
"time": "时间",
"120": "120",
"}": "}",
",": ",",
"{": "{",
"ignition": "点火",
"1": "1",
",": ",",
"time": "时间",
"121": "121",
"}": "}",
",": ",",
"{": "{",
"ignition": "点火",
"1": "1",
",": ",",
"time": "时间",
"122": "122",
"}": "}",
",": ",",
"{": "{",
"ignition": "点火",
"0": "0",
",": ",",
"time": "时间",
"123": "123",
"}": "}",
"]": "]",
"\n": "\n",
"\n": "\n",
"我想要的输出如下:": "我想要的输出如下:",
"{": "{",
"time": "时间",
":": ":",
"[": "[",
"112": "112",
",": ",",
"193": "193",
"]": "]",
",": ",",
"time": "时间",
":": ":",
"[": "[",
"116": "116",
",": ",",
"117": "117",
",": ",",
"118": "118",
"]": "]",
",": ",",
"time": "时间",
":": ":",
"[": "[",
"120": "120",
",": ",",
"121": "121",
",": ",",
"122": "122",
"]": "]"
}
英文:
I want to group the data based on the values of the "ignition" field. If the "ignition" value is 1, all records with the value 1 should be grouped together until the next value of 0 is encountered, and so on.
I have 86400 records in MongoDB, and I want to query the data to achieve the desired output.
The data looks like this:
[
{
ignition: 1,
time: 112
},
{
ignition: 1,
time: 193
},
{
ignition: 0,
time: 115
},
{
ignition: 1,
time: 116
},
{
ignition: 1,
time: 117
},
{
ignition: 1,
time: 118
},
{
ignition: 0,
time: 119
},
{
ignition: 1,
time: 120
},
{
ignition: 1,
time: 121
},
{
ignition: 1,
time: 122
},
{
ignition: 0,
time: 123
},
]
I want the output like this:
{
time: [112,193],
time: [116,117,118],
time: [120,121,122]
}
答案1
得分: 1
db.collection.aggregate([
{
$setWindowFields: {
partitionBy: null,
sortBy: {time: 1},
output: {
"groupNum": {
$sum: {
$cond: [
{$eq: ["$ignition", 1]}, 0, 1
]
},
window: {
documents: ["unbounded","current"]
}
}
}
}
},
{
$match: {"ignition": 1}
},
{
$group: {
_id: "$groupNum",
time: {$push: "$time"}
}
},
{
$sort: {_id: 1}
}
])
英文:
db.collection.aggregate([
{
$setWindowFields: { //6. the output of this stage is, each set of adjacent documents having same $ignition will have a unique groupNum
partitionBy: null,
sortBy: {time: 1}, //4. from all documents sorted by $time
output: {
"groupNum": { //1. create a new field groupNum
$sum: { //2. by cumulatively adding
$cond: [
{$eq: ["$ignition",1]}, 0, 1 //3. modified $ignition field
]
},
window: {
documents: ["unbounded","current"] //5. starting from the beginning to current document
}
}
}
}
},
{
$match: {"ignition": 1} //7. retain $ignition : 1
},
{
$group: {
_id: "$groupNum", //8. group by groupNum
time: {$push: "$time"} //9. pushing the time to an array
}
},
{
$sort: {_id: 1} //10.sort as necessary
}
])
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论