【问题标题】:Use $gte and &lte mongo operator if date is in string format in mongodb如果日期在 mongodb 中为字符串格式,则使用 $gte 和 &lte mongo 运算符
【发布时间】:2019-01-09 20:22:37
【问题描述】:

我在数据库中有像 {dob:"02-23-2000"} 这样的 dob 字段。现在我想在字符串格式的 dob 字段上执行$gte&lte,如下所示:

db.panelists.count({"dob":{ '$gte': '08-02-1998', '$lte': '08-02-2003' }});

我总是将计数值设为零。

谁能帮我以相同的 dob 格式解决此查询。

【问题讨论】:

  • mongodb版本?
  • @AnthonyWinzlet 我使用的是 3.6 db 版本

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

您可以在 mongodb 3.6

中尝试以下聚合

您可以使用 $dateFromString 聚合将您的 dob 从 字符串到日期,然后轻松$count 应用$match 的文档就可以了。

1) 使用聚合与$addFields

db.panelists.aggregate([
  { "$addFields": {
    "date": {
      "$dateFromString": { "dateString": "$dob", "format": "%m-%d-%Y" }
    } 
  }},
  { "$match": {
    "date": {
      "$gte": moment('08-02-1998').toDate(),
      "$lte": moment('08-02-2003').toDate()
    }
  }},
  { "$count": "count" }
])

2) 通过$expr使用简单的查找查询

db.collection.find({
  "$expr": {
    "$and": [
      {
        "$gte": [
          { "$dateFromString": { "dateString": "$dob", "format": "%m-%d-%Y" }},
          ISODate("2000-02-22T00:00:00Z")
        ]
      },
      {
        "$lte": [
          { "$dateFromString": { "dateString": "$dob", "format": "%m-%d-%Y" }},
          ISODate("2000-02-24T00:00:00Z")
        ]
      }
    ]
  }
})

3) 通过$expr使用聚合

db.collection.aggregate([
  { "$match": {
    "$expr": {
      "$and": [
        {
          "$gte": [
            { "$dateFromString": { "dateString": "$dob", "format": "%m-%d-%Y" }},
            ISODate("2000-02-22T00:00:00Z")
          ]
        },
        {
          "$lte": [
            { "$dateFromString": { "dateString": "$dob", "format": "%m-%d-%Y" }},
            ISODate("2000-02-24T00:00:00Z")
          ]
        }
      ]
    }
  }}
])

【讨论】:

  • 或者如果字符串在正确的 ISO8601 中,字符串比较也可以正常工作。
  • @SergioTulentsev 是的,但是由于 OP 以字符串格式存储 dob,这就是需要对话的原因
  • @AnthonyWinzlet 我收到错误“ReferenceError: moment is not defined”,当我用谷歌搜索这个错误时,我发现 moment 是 node js 函数,它不能在 mongo shell 上运行。
  • @AnthonyWinzlet:是的,我指的是 ISO8601 中的字符串。 dob: "1998-02-08"。使用这种格式,可以直接比较字符串。
  • @AnthonyWinzlet 感谢您的回答。 +1 并接受了答案。
猜你喜欢
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2021-09-17
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多