我想从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 }
}
答案 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") });