我想限制我正在做的查询只查看过去 24 小时内创建的文档。
构建此查询的最佳方法是什么?如何根据日期进行限制?
添加createdAt
字段,索引它,然后查询
db.getCollection("COLLECTION_NAME").find({"createdAt":{$gt:new Date(Date.now() - 24*60*60 * 1000)}})
这将返回所有早于 86400 秒的记录。
如果您没有使用任何其他索引并且使用默认的 ObjectID 作为您的 _id,您可以执行以下操作:
var ObjectID = require('mongodb').ObjectID
db.collection.find({
_id: {
$gt: ObjectID.createFromTime(Date.now() / 1000 - 24*60*60)
}
}, callback)
对于通过 google 登陆的其他人,您可以在 mongo shell 中执行此操作,如下所示:
db.collection.find({ $where: function () { return Date.now() - this._id.getTimestamp() < (24 * 60 * 60 * 1000) } })
在猫鼬中使用它
let ObjectId = require('mongodb').ObjectID;
Property.find({
_id: {
$gt: ObjectId.createFromTime(Date.now() / 1000 - 24 * 60 * 60)
}
}, (err, result) => {
console.log(err || result);
});
首先,如果您向人们提供您的收藏模式,那将真的很有帮助。
但仅仅因为它已经过去了 3 个小时而且没有人回复我会尝试:
假设您有条目,并且它有一个 createdAt 字段,它是一个 ISODate:
{
somefield: "test",
createdAt: ISODate("2012-08-13T04:00:00Z")
}
所以你需要做的是在这个字段上放一个索引
db.yourColl.ensureIndex({createdAt:1});
然后你在 node.js 中得到你当前的时间来代替你的 24 小时并得到你的 start 值。(据我所知,mongdb 中没有 NOW 的类似物。如果我错了,请纠正我。)
db.yourColl.find({
createdAt: {
$gte: start
}
});
希望这可以帮助某人。我正在使用 pymongo 查询最近 24 小时的数据。就我而言,我必须将当前时间转换为 BSON 时间戳。
首先我必须导入 Bson 时间戳:
from bson.timestamp import Timestamp
然后在我的搜索查询中,我执行了以下操作:
yesterday = datetime.datetime.now() - datetime.timedelta(days=1)
findQuery = {
"unix": {
"$gte": Timestamp(int(yesterday.strftime("%s")),0)
}
}
从 开始,这是新聚合运算符Mongo 5.0
的一个很好的用例:$dateDiff
// { "_id" : ObjectId("60c8f804fb832fe2f2011657") }
db.collection.aggregate([
{ $match: { $expr:
{ $lt: [{ $dateDiff: { startDate: "$_id", endDate: "$$NOW", unit: "hour" } }, 24 ]}
}}
])
// { "_id" : ObjectId("60c8f804fb832fe2f2011657") } // if document created within the last 24 hours
需要注意的几点:
“TIME”是存储时间戳的字段
db.your_collection_name.find({"TIME":{'$lt': new Date(),'$gte':new Date(new Date().setDate(new Date().getDate()-1))}},{}).count();
我遇到了同样的问题,经过大量搜索,我发现从过去 X 天获取数据的最佳解决方案是这样的:
let date_obj = new Date();
let requestedTime = new Date(new Date().setDate(date_obj.getDate() - day));
db.collection.find({
createdAt: {$gt: requestedTime}
});
day 变量必须是您想要的天数的数值,例如:1 表示一天前(过去 24 小时),2 表示两天前(过去 48 小时),30 表示上个月,60 表示最后两个月,以此类推。..
let date_obj = new Date();
let requestedTime = new Date(new Date().setDate(date_obj.getDate() - 1));
document.querySelector("#current_date").innerHTML = `current date: ${date_obj}`
document.querySelector("#last_24H_date").innerHTML = `last 24 hours: ${requestedTime}`
<div id="current_date"></div>
<div id="last_24H_date"></div>
db.video.find({"timestamp":{$lt: new Date(),$gte: new Date(new Date().setDate(new Date().getDate()-1))}})