说明:我想从这个time start和end time中提取data。每当0出现时,它就意味着它将是一个结束时间,如果下一个值大于0,那么它的新时间就会启动,我想在新时间开始时将文档拆分为多个文档,该值将>0。
用例是:用户一天工作多次,而不是一整天(9:00到17:00)。例如,用户正在工作(9-10,11-12,15-16)。所以我们得把文件分成9-10,11-12,15-16。无论何时值为0,这意味着用户不工作,这将是时间结束。当值>0时,它意味着用户再次开始工作。
{
"data": {
"2020-09-04T12:18:41Z": 0,
"2020-09-04T12:18:42Z": 1,
"2020-09-04T14:59:50Z": 1,
"2020-09-04T14:59:59Z": 0,
"2020-09-04T15:00:00Z": 0,
"2020-09-04T15:00:01Z": 1,
"2020-09-04T15:05:00Z": 1,
"2020-09-04T15:05:01Z": 0,
"2020-09-04T15:40:00Z": 0,
"2020-09-04T15:40:01Z": 1,
"2020-09-04T16:00:00Z": 1,
"2020-09-04T16:00:01Z": 0,
"2020-09-04T16:30:00Z": 0,
"2020-09-04T16:30:01Z": 1,
"2020-09-04T16:52:50Z": 1,
"2020-09-04T16:52:51Z": 0,
"2020-09-04T18:10:00Z": 0,
"2020-09-04T18:10:01Z": 1,
"2020-09-04T18:35:00Z": 1,
"2020-09-04T18:35:01Z": 0,
"2020-09-04T18:59:00Z": 0,
"2020-09-04T18:59:01Z": 1,
"2020-09-04T19:00:00Z": 1,
"2020-09-04T19:00:01Z": 0,
"2020-09-04T19:30:00Z": 0,
"2020-09-04T19:30:01Z": 1,
"2020-09-04T19:52:50Z": 1,
"2020-09-04T19:52:51Z": 0
}
}发布于 2021-09-10 08:22:32
当您使用实际值作为字段名时,设计非常糟糕。无论如何,您可以使用这样的聚合管道:
db.collection.aggregate([
// Transform to array
{ $set: { data: { $objectToArray: "$data" } } },
// Sort the date values, bear in mind fields have an aribitary order, they are not sorted!
{ $unwind: "$data" },
{ $sort: { "data.k": 1 } },
{ $group: { _id: null, data: { $push: { k: "$data.k", v: "$data.v" } } } },
// do the actual logic
{
$set: {
data: {
$reduce: {
input: "$data",
initialValue: [],
in: {
$cond: {
if: { $eq: ["$$this.v", 0] },
then: {
$concatArrays: [
"$$value",
[{
k: "$$this.k",
v: "$$this.v",
group: {
$cond: {
if: { $ne: [{ $last: "$$value.v" }, 0] },
then: { $ifNull: [{ $last: "$$value.group" }, 0] },
else: { $add: [{ $ifNull: [{ $last: "$$value.group" }, 0] }, 1] }
}
}
}]
]
},
else: {
$concatArrays: [
"$$value",
[{
k: "$$this.k",
v: "$$this.v",
group: { $last: "$$value.group" }
}]
]
}
}
}
}
}
}
},
// Split into documents per group
{ $unwind: "$data" },
{
$group: {
_id: "$data.group",
start_time: { $first: "$data.k" },
end_time: { $last: "$data.k" }
}
}
])https://stackoverflow.com/questions/69128019
复制相似问题