如果日期在 mongodb 中为字符串格式,则使用 $gte 和 <e mongo 运算符

Nil*_*mar 6 mongodb mongodb-query aggregation-framework

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

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

我总是将计数值设为零。

任何人都可以帮助我以相同的 dob 格式解决此查询。

Ash*_*shh 9

您可以在 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" }
])
Run Code Online (Sandbox Code Playgroud)

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")
        ]
      }
    ]
  }
})
Run Code Online (Sandbox Code Playgroud)

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")
          ]
        }
      ]
    }
  }}
])
Run Code Online (Sandbox Code Playgroud)

  • 或者,如果字符串在正确的 ISO8601 中,字符串比较也同样有效。 (3认同)