【问题标题】:Query using $dateFromString and $lt and $lge in mongodb在 mongodb 中使用 $dateFromString 和 $lt 和 $lge 进行查询
【发布时间】:2021-04-21 14:52:00
【问题描述】:

我正在尝试从 mongodb 返回一些日期范围的记录,并且我正在尝试使用以下查询来查询字段 StartDate 的集合测试:

db.test.aggregate([
  {
    $match: {
      "StartDate": {
        "$gte": [
          {
            "$dateFromString": {
              "dateString": "2021-03-01T00:00:00.0000000Z"
            }
          }
        ],
        "$lt": [
          {
            "$dateFromString": {
              "dateString": "2021-04-01T00:00:00.0000000Z"
            }
          }
        ]
      }
    }
  }
])

上述查询没有返回任何内容,但我确信日期之间有一些数据。任何想法我错过了什么?谢谢!

【问题讨论】:

  • 您使用的是什么编程语言?试试 JS { StartDate: { $gte: new Date("2021-03-01T00:00:00.0000000Z"), $lt: new Date("2021-04-01T00:00:00.0000000Z") } }
  • $match 使用查询运算符,为了使用聚合运算符,它们需要在 $expr 表达式中
  • 嗨,Turivishal,我之前使用过 JS,它正在工作,但 Azure Logic App 无法识别 JS,所以我必须找到另一种方法来让它工作,这就是我尝试使用的原因纯 Mongo 查询 $dateFromString 首先将字符串转换为日期并进行比较,但它不起作用。
  • 嗨,乔,我将 $match 更改为 $expr 并收到错误“无法识别的管道阶段名称:$expr”。我正在对 Cosmos DB (mongo API) 运行查询。也许 CosmosDB 不支持它?

标签: mongodb mongodb-query


【解决方案1】:

$dateFromString是一个聚合管道运算符,所以它需要匹配$expr表达式条件,并且表达式有$gte$lt的不同语法,

db.test.aggregate([
  {
    $match: {
      $expr: {
        $and: [
          {
            $gte: [
              "$StartDate",
              {
                "$dateFromString": {
                  "dateString": "2021-03-01T00:00:00.0000000Z"
                }
              }
            ]
          },
          {
            $lt: [
              "$StartDate",
              {
                "$dateFromString": {
                  "dateString": "2021-04-01T00:00:00.0000000Z"
                }
              }
            ]
          }
        ]
      }
    }
  }
])

Playground


第二个选项:您可以使用$dateFromString$toDate 运算符替代,

Playground


根据新要求更新:

字段activities.dateOfActivity是一个数组,它需要遍历循环并检查每个日期的条件,

  • $map迭代activities.dateOfActivity数组的循环并将两个条件都放入其中,如果两个条件都满足则返回true,否则返回false
  • $anyElementTrue 将检查返回的布尔数组是否有任何真实条件,然后返回文档
db.test.aggregate([
  {
    $match: {
      $and: [
        {
          "$expr": {
            $anyElementTrue: {
              $map: {
                input: "$activities.dateOfActivity",
                in: {
                  $and: [
                    {
                      "$gte": [
                        "$$this",
                        {
                          "$dateFromString": {
                            "dateString": "2021-03-01T00:00:00.0000000Z"
                          }
                        }
                      ]
                    },
                    {
                      "$lt": [
                        "$$this",
                        {
                          "$dateFromString": {
                            "dateString": "2021-04-20T00:00:00.0000000Z"
                          }
                        }
                      ]
                    }
                  ]
                }
              }
            }
          }
        }
      ]
    }
  }
])

Playground

【讨论】:

  • "$StartDate" 是 DateFieldinmyCollection 吗?例如,我的日期字段名为 SystemCreatedDate,我是否应该将“$StartDate”替换为“SystemCreatedDate”?
  • StartDate 是集合中的日期字段,$ 需要在表达式中引用该字段。
  • 你可以在条件下使用$SystemCreatedDate而不是$StartDate
  • 因此,如果该字段位于数组中,我应该将其更改为“$MyArray.MyDateField”,对吗?在 CosmosDB 上运行时出现“未知运算符:$expr”错误。看起来目前不支持 $expr..
  • 可能是它在 cosmosdb 中不支持我刚刚看到这个link,如果你有任何东西,请按照这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 2021-11-26
相关资源
最近更新 更多