首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提取有关0值的时间,在MongoDB数组操作中查找一天中的多个工作时间。

提取有关0值的时间,在MongoDB数组操作中查找一天中的多个工作时间。
EN

Stack Overflow用户
提问于 2021-09-10 06:17:09
回答 1查看 37关注 0票数 1

说明:我想从这个time startend time中提取data。每当0出现时,它就意味着它将是一个结束时间,如果下一个值大于0,那么它的新时间就会启动,我想在新时间开始时将文档拆分为多个文档,该值将>0。

用例是:用户一天工作多次,而不是一整天(9:00到17:00)。例如,用户正在工作(9-10,11-12,15-16)。所以我们得把文件分成9-10,11-12,15-16。无论何时值为0,这意味着用户不工作,这将是时间结束。当值>0时,它意味着用户再次开始工作。

代码语言:javascript
复制
{
    "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
}​
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-10 08:22:32

当您使用实际值作为字段名时,设计非常糟糕。无论如何,您可以使用这样的聚合管道:

代码语言:javascript
复制
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" }
      }
   }
])

蒙戈游乐场

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69128019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档