【问题标题】:Need to compare 2 different date fields in mongodb需要在 mongodb 中比较 2 个不同的日期字段
【发布时间】:2018-12-25 00:20:52
【问题描述】:

我的Mongo 数据库中有两个日期字段,我想将它们的差异(即它们的“年龄”)与一个值(以年为单位)进行比较。

例如:我想查找 15 岁以上的 Pharmacies

(CurrentDate - EstablishDate) > 15(记住CurrentYear,因为它可能不是今天的日期) 这样做的方法是什么?

下面的示例文档数组:

[
  {
    "Pharmacy": "a",
    "EstablishedDate": ISODate("2006-10-12"),
    "CurrentDate": ISODate("2018-07-17"),
    "Medicine": [
      {
        "MedName": "MedA",
        "Quantity": 55,
        "Type": "Admission"
      },
      {
        "MedName": "MedB",
        "Quantity": 34,
        "Type": "Admission"
      },
      {
        "MedName": "MedD",
        "Quantity": 25,
        "Type": "Discharge",

      }
    ]
  },
  {
    "Pharmacy": "b",
    "EstablishedDate": ISODate("2015-02-02"),
    "CurrentDate": ISODate("2018-07-17"),
    "Medicine": [
      {
        "MedName": "MedB",
        "Quantity": 60,
        "Type": "Critical"
      },
      {
        "MedName": "MedC",
        "Quantity": 34,
        "Type": "mild"
      }
    ]
  }
]

【问题讨论】:

  • 您可以使用聚合管道及其$subtract 运算符:docs.mongodb.com/manual/reference/operator/aggregation/subtract
  • docs.mongodb.com/manual/reference/operator/query/expr 在查找查询中使用聚合表达式。附带说明一下,将 CurrentDate 作为文档的属性是非常不寻常的。无法想象不同文档的时间流向不同的用例。
  • @AlexBlex 是的,CurrentDate 具有误导性。将其视为一个绝对比药房旧的日期字段。如果它使事情更清楚,我会改变它。
  • 那么你的意思是我们需要找到“EstablishedDate”大于“CurrentDate”的药店吗?
  • 不,我需要(当前日期 - 已建立日期)> 15。我会用这个更新我的问题。

标签: node.js mongodb mongodb-query


【解决方案1】:

您可以使用日期时间运算符$year 来提取年份。

类似

db.colname.find({"$expr":{
  "$gt":[
    {"$subtract":[
      {"$year":"$CurrentDate"},
      {"$year":"$EstablishedDate"}
    ]},
    15
  ]
}})

【讨论】:

    【解决方案2】:

    请检查此汇总查询:

    db.test.aggregate([
        {
        "$redact": {
            "$cond": [{
                "$gt": [{ 
                    "$divide": [{
                        "$subtract": ["$CurrentDate", "$EstablishedDate"] },
                        1000 * 60 * 60 * 24 * 365
                    ]},
                15
                ]},
                "$$KEEP",
                "$$PRUNE"
                ]
            }
        }
    ])
    

    在这里,我们减去CurrentDateEstablishedDate 并找出它们之间的年差。如果它大于 15,那么我们才会显示它们。

    试试这个,让我知道它是否适合你。

    【讨论】:

      【解决方案3】:

      你可以试试下面的聚合

       db.collection.aggregate([
        {
          "$redact": {
            "$cond": [
              {
                "$lt": [
                  {
                    "$divide": [
                      {
                        "$subtract": [
                          "$CurrentDate",
                          "$EstablishedDate"
                        ]
                      },
                      1000 * 60 * 60 * 24
                    ]
                  },
                  365 * 15
                ]
              },
              "$$KEEP",
              "$$PRUNE"
            ]
          }
        }
      ])
      

      【讨论】:

      • 是的,这几乎回答了我的问题,虽然我正在使用管道,但我从这里提取了让我感到困惑的位。谢谢!
      猜你喜欢
      • 2013-08-09
      • 1970-01-01
      • 2020-01-26
      • 2023-03-29
      • 1970-01-01
      • 2015-08-22
      • 2022-07-08
      • 2012-11-27
      • 2015-09-13
      相关资源
      最近更新 更多