MongoDB使用CurrentDate查找Query比较

时间:2015-06-11 05:29:05

标签: mongodb

我想从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 } 
}

3 个答案:

答案 0 :(得分:7)

根据您的问题 ,您希望从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()
  }
}

答案 1 :(得分:2)

请在您的模式定义之后添加timeStamp: true,以获取自动生成的createdAt和updatedAt字段,MongoDB会处理。

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

在您的情况下,您需要将时间戳记密钥与今天的开始时间( 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 

答案 2 :(得分:0)

您可以使用以下查询执行此操作。

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") });