【问题标题】:Mongodb aggregation get documents by stringdateMongodb聚合通过stringdate获取文档
【发布时间】:2021-08-24 21:47:27
【问题描述】:

我有这样的文件列表

  "Location_id": "60b53d92ccb1483964da45f9",
    "SensorIdentifier": "CCCCCCCCCCCCCCCC",
    "SensorType": "Temperature",
    "status": true,
    "data": [
      {
        "temperature": 22.5,
        "humidite": 38.2,
        "batterie": 50,
        "time": 1623083627736,
        "date": "7-6-2021"
      },

我想按日期过滤它们,例如我想通过过滤数据数组中的子文档来获取日期在 2021 年 6 月 6 日和 2021 年 7 月 6 日之间的文档, 请注意,日期字段是字符串,现在这是我的解决方案:


  {
    "$match": {
      "$expr": {
        "$and": [
          {
            "$gte": [
              "$date",
              {
                "$dateFromString": {
                  "dateString": "4-6-2021",
                  "format": "%m-%d-%Y"
                }
              }
            ]
          },
          {
            "$lte": [
              "$date",
              {
                "$dateFromString": {
                  "dateString": "7-6-2021",
                  "format": "%m-%d-%Y"
                }
              }
            ]
          }
        ]
      }
    }
  },

【问题讨论】:

  • 您想通过creationDate 属性或data 数组中的date 属性过滤文档吗?
  • 是的,数据数组中的日期属性
  • 您是要过滤data 数组中的所有子文档,还是要过滤在data 数组中至少有一项在两个日期之间的所有文档?
  • 感谢回复我的帖子,是的,我想过滤数据数组中的所有子文档
  • 那个time 字段看起来是一个与字符串日期匹配的纪元时间戳?如果是这种情况,那么按该值进行过滤的开销将大大减少。

标签: mongodb date aggregation-framework


【解决方案1】:

你可以这样做:

db.collection.aggregate([
  {
    "$match": {
      "Location_id": "60b53d92ccb1483964da45f9"
    }
  },
  {
    "$set": {
      "data": {
        "$filter": {
          "input": "$data",
          "cond": {
            "$and": [
              {
                "$lte": [
                  {
                    "$dateFromString": {
                      dateString: "$$this.date",
                      format: "%m-%d-%Y"
                    }
                  },
                  {
                    "$dateFromString": {
                      dateString: "7-6-2021",
                      format: "%m-%d-%Y"
                    }
                  }
                ]
              },
              {
                "$gte": [
                  {
                    "$dateFromString": {
                      dateString: "$$this.date",
                      format: "%m-%d-%Y"
                    }
                  },
                  {
                    "$dateFromString": {
                      dateString: "4-6-2021",
                      format: "%m-%d-%Y"
                    }
                  }
                ]
              }
            ]
          }
        }
      }
    }
  }
])

下面是工作示例:https://mongoplayground.net/p/-l2O6wp9SFV

【讨论】:

  • @Yesser Rebai :如果这解决了您的问题,请点击左侧的复选标记来回答 Nenad。
  • 对不起,我需要 15 个声望才能做到这一点
猜你喜欢
  • 1970-01-01
  • 2015-05-08
  • 2020-03-21
  • 1970-01-01
  • 2019-01-17
  • 2021-07-26
  • 2016-12-19
  • 2017-03-18
  • 2020-12-03
相关资源
最近更新 更多