MongoDB find Query与CurrentDate的比较

wlzqhblo  于 2023-10-16  发布在  Go
关注(0)|答案(5)|浏览(89)

我想从MongoDB集合中获取当前文档。我的文档看起来像这样:

{ 
    "_id" : ObjectId("55743941789a9abe7f4af3fd"), 
    "msisdn" : "9xxxxxxxxxx", 
    "act_date" : ISODate("2014-11-24T00:00:00Z"), 
    "date" : ISODate("2015-06-07T00:00:00Z"), 
    "recharge" : { "recharge_amt" : 0, "rechargetype" : "WEB" },
    "voice" : { "local_og_mou" : 20, "local_other_mobile_og_mou" : 0, "nld_og_mou" : 0, "nld_other_mobile_og_mou" : 10 }, 
    "gprs" : { "total_access_count" : 1, "total_datavolume_mb" : 42 }, 
    "sms" : { "freesms" : 3, "local_sms_count" : 0, "nat_sms_count" : 0, "inter_sms_count" : 0 } 
}
wmtdaxz3

wmtdaxz31#

你可以做一个简单的表达式匹配,如下所示:

$match: {
  $expr: {$eq: [{$year: '$start_date'}, {$year: new Date()}]},
  $expr: {$eq: [{$month: '$start_date'}, {$month: new Date()}]},
  $expr: {$eq: [{$day: '$start_date'}, {$day: new Date()}]},
}
pokxtpni

pokxtpni2#

在MongoDB v5.0+中,您可以使用$dateTrunc执行仅日期的比较(没有时间)。与$$NOW比较以获取当前日期的文档。

db.collection.aggregate([
  {
    "$match": {
      $expr: {
        $eq: [
          {
            $dateTrunc: {
              date: "$startDate",
              unit: "day"
            }
          },
          {
            $dateTrunc: {
              date: "$$NOW",
              unit: "day"
            }
          }
        ]
      }
    }
  }
])

Mongo Playground

k2fxgqgv

k2fxgqgv3#

根据你的问题 * 你想从mongodb集合中获取当前的文档 *。在mongoDB shell中,当你输入new Date()时,它会给你当前的日期和时间,当你运行相同的new Date()时,这个值总是不同的,所以你的查询可能是这样的:

db.collectionName.find({"start_date":new Date()}).pretty()

但是,我认为这个查询会返回那些将出现在您的集合中的文档,但相同的当前Date值可能不会出现在您的文档中,因此这种情况下,您应该使用以下方法

db.collectionName.find({"start_date":{"$lte":new Date()}}).pretty()

db.collectionName.find({"start_date":{"$gte":new Date()}}).pretty()

在某些情况下,如果你想找到year,month,day的精确匹配,那么你应该像这样使用aggregation$year,$month,$dayOfMonth in $project

db.collectionName.aggregate({
  "$project": {
    "year": {
      "$year": "$date"
    },
    "month": {
      "$month": "$date"
    },
    "day": {
      "$dayOfMonth": "$date"
    }
  }
}, {
  "$match": {
    "year": new Date().getFullYear(),
    "month": new Date().getMonth() + 1, //because January starts with 0
    "day": new Date().getDate()
  }
})

在上面的聚合查询中,将返回那些与当前日期匹配的文档,例如当前日期的year,month,day。另外,将$match替换为

var currentDate = new Date()

 {
  "$match": {
    "year": currentDate.getFullYear(),
    "month": currentDate.getMonth() + 1, //because January starts with 0
    "day": currentDate.getDate()
  }
}
58wvjzkj

58wvjzkj4#

如果你使用的是Mongoose,你可以在模式定义后包含timeStamp: true来获取自动生成的createdAt和updatedAt字段,Mongoose会处理它。

const itemSchema = mongoose.Schema({
    // Your Schema definition here
}, {
  timestamps: true
})

在您的情况下,您需要将TimeStamp密钥与今天的开始(12 AM,ISO字符串为2019-11-08T00:00:00.000Z)和一天的结束(11:59 PM,ISO字符串为2019-11-08T23:59:59.999Z)进行比较。
下面的代码将为您做这件事。

let queryObj = {}
const startOfDay = new Date(new Date().setUTCHours(0, 0, 0, 0)).toISOString()
const endOfDay = new Date(new Date().setUTCHours(23, 59, 59, 999)).toISOString()
    
queryObj.createdAt = {
  $gte: startOfDay, // 2019-11-08T00:00:00.000Z
  $lt: endOfDay // 2019-11-08T23:59:59.999Z
}

let items = item.find(obj)
// new Date().setUTCHours(0, 0, 0, 0) Generates this weird string '1573171200000' which is not a human readable format of TimeStamp
// To convert it into ISO String we have .toISOString() method
j91ykkif

j91ykkif5#

您可以使用下面的查询来完成此操作。

db.collection.find({"start_date" : { $gte : new ISODate("2015-05-27T00:00:00Z") }});

注:以上查询返回的单据将不是指定日期。

找到一个日期等于另一个日期

db.collection.find({"start_date" : new ISODate("2015-05-27T00:00:00Z") });

相关问题