将字符串转换为日期并获得差异

时间:2018-06-14 16:29:31

标签: node.js mongodb mongoose nosql schema

我在“食物”中的数据记录很少。 schema -mongodb

{
    "_id": "5b220199acbec1409cbf84dd",
    "Name": "Mongo",
    "ID_No": "BA1233",
    "Content": "Bottle",
    "No_packages": 5,
    "No_items": 6,
    "Qty": 30,
    "Mfg": "2018-05-27",
    "Exp": "2018-06-30",
    "__v": 0
  }

我想获取日期差异(Exp-today Date)小于30的数据集。 我使用以下命令尝试了它。但它没有用。

db.food.find({$lt: { $subtract: [ Date() , Exp ],"30"}}  )

2 个答案:

答案 0 :(得分:0)

如果我没弄错的话,你想要的文件有Exp - 今天的日期不到30天。换句话说,今天的日期+ 30天> = Exp。将30天转换为毫秒

尝试以下方法:

db.food.aggregate(
    {
        $project: {
            _id: 0,
            Name: 1,
            exp_date_calc: new Date(ISODate().getTime() + 30 * 24 * 60 * 60 * 1000).toISOString()
        },
    }, {
        $match: { exp_date_calc: { $gt: "$Exp" } }
    }
);

或者可能是这个:

db.food.aggregate(
    {
        $project: {
            _id: 0,
            Name: 1,
            expdate: {
                $dateFromString: {
                    dateString: '$Exp'
                }
            },
            exp_date_calc: new Date(ISODate().getTime() + 30 * 24 * 60 * 60 * 1000)
        },
    }, {
        $match: { exp_date_calc: { $gte: "$expdate" } }
    }
);

参考:Adding/Subtracting days to ISODate in MongoDB Shell

答案 1 :(得分:0)

您需要先使用$dateFromString (aggregation) 将日期从字符串转换为日期格式,然后$redact (aggregation) 以删除不匹配的文档

db.collection.aggregate([
  { "$addFields": {
    "date": {
      "$dateFromString": {
        "dateString": "$EXP"
      }
    }
  }},
  { "$redact": {
    "$cond": [
      { "$lt": [
        { "$divide": [
          { "$subtract": [new Date(), "$date"] },
          1000 * 60 * 60 * 24
        ]},
        30
      ]},
      "$$KEEP",
      "$$PRUNE"
    ]
  }}
])