gpt4 book ai didi

javascript - 使用 _id 为日期查询条件

转载 作者:可可西里 更新时间:2023-11-01 10:03:35 26 4
gpt4 key购买 nike

我知道 _id 字段可以转换成日期。
这是函数:

ObjectId.prototype.getTimestamp = function() {
return new Date(parseInt(this.toString().slice(0,8), 16)*1000);
}

然后我可以使用 doc._id.getTimestamp(); 来显示文档的创建日期时间。

问题是,文档只有与日期相关的_id 字段。我的问题是:如何只通过_id查询特定日期范围内的文档?

最佳答案

您可以使用 $where它将 JavaScript 发送到服务器以进行查询。但是忘记原型(prototype),因为所有逻辑都必须是自包含的或以其他方式加载到服务器。这意味着它必须在函数中被评估:

db.collection.find(function() {
return
( new Date(parseInt(this._id.toString().slice(0,8), 16)*1000)
> new Date("2015-01-01") ) &&
( new Date(parseInt(this._id.toString().slice(0,8), 16)*1000)
< new Date("2015-02-01") );
})

但这不是一个好主意,因为 $where 不能使用“索引”来过滤匹配项。

您最好使用实际日期对象创建“时间戳”字段并使用 $lt$gt运营商本身。该实际字段可以被索引,运算符(operator)将使用它来进行选择。

另一种方法是找出查询之外的 ObjectId 值,然后使用标准运算符:

var start =  ObjectId(
(new Date("2015-01-01").valueOf() / 1000).toString(16) + "0000000000000000")
),
end = ObjectId(
(new Date("2015-02-01").valueOf() / 1000).toString(16) + "0000000000000000")
);

db.collection.find({ "_id": { "$gt": start, "$lt": end } })

根据日期创建 ObjectId 值,并允许您使用始终存在的主键索引。

某些驱动程序甚至在其 ObjectId 实现中支持“从时间戳创建”方法。

关于javascript - 使用 _id 为日期查询条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31309491/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com