首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有服务器时间的MongoDB查询日期字段

具有服务器时间的MongoDB查询日期字段
EN

Stack Overflow用户
提问于 2017-07-14 12:21:03
回答 2查看 1.7K关注 0票数 0

我有包含使用$currentDate插入的日期的字段的mongo文档,所以当我插入文档时,该字段具有mongo服务器日期。我想查询和过滤日期字段和服务器日期之间的差异超过10分钟的所有文档。

假设这个db:

代码语言:javascript
运行
复制
{ "_id" : 1, "item" : "abc", "price" : 10, "fee" : 2, "discount" : 5, "date" : ISODate("2017-07-14T08:00:00Z") }
{ "_id" : 2, "item" : "jkl", "price" : 20, "fee" : 1, "discount" : 2, "date" : ISODate("2017-07-14T08:05:00Z") }

假设我将在"2017-07-14T08:10:01Z“服务器日期运行查询,我希望查询只返回第一项。

代码语言:javascript
运行
复制
db.items.aggregate([
{$project : {lut : {$subtract: ["** server date **", "$date" ]}}}, 
{$match : { lut : {$gte : 10*60*1000 }}} ]);

在运行查询时,如何获得服务器日期?我正在从我的nodeJS服务器运行查询,用新的Date()替换服务器日期将得到节点服务器的日期,而不是mongo服务器的日期。

EN

回答 2

Stack Overflow用户

发布于 2017-07-16 10:34:36

这比乍一看要复杂得多。当涉及复制和切分时,很难保证所有Mongo实例上时钟之间的完美同步。正如开发团队在这张票据上解释的那样,这就是为什么$currentDate没有扩展到查询的原因。

尽管如此,一个完美的解决方案并不存在,但我们可以考虑解决办法。serverStatus函数返回关于Mongo集群的信息,包括服务器时间。您可以在初始化客户端代码时调用此函数,并查找客户端时间和服务器时间之间的差异。有了这种差异,您可以根据与此差异更正的客户端时间进行查询。这里有一个Python片段:

代码语言:javascript
运行
复制
import datetime
import pymongo
client = pymongo.MongoClient()
db = client.test_Db
server_time = db.command("serverStatus")['localTime']
local_time = datetime.datetime.now()
difference = server_time - local_time


db.test_collection.find({'date': {'$lt': datetime.datetime.now() - datetime.timedelta(minutes=10) + difference}})

请注意,这在服务器上测量时间的时刻和在客户端上测量时间之间存在错误。此错误受信息从服务器发送到客户端的持续时间的影响。根据您的使用情况,您可以从数据库返回更多或更少的文档。如果您首先在客户机上获得时间,然后在服务器上获得时间,您将收到比早10分钟+错误的文档,因此您将错过一些文档。另一方面,如果您首先在服务器上获得时间,然后在客户端上,您将收到比早10分钟的文档--错误,因此您将得到一些额外的文档。这取决于这些案件中是否有一个是可以接受的。

另一件需要考虑的事情是,只设置一个限制,您就会收到越来越多的文档,因为一次更新的文档将超过10分钟。而且,你会一次又一次地收到同样的文件。你也应该考虑设定一个下限。

票数 3
EN

Stack Overflow用户

发布于 2017-07-16 09:11:29

mongodb服务器允许update字段使用$currentDate操作符,但我没有找到像查询筛选器那样使用日期的任何选项。

但是有一个选项可以使用“在服务器上存储JavaScript函数”https://docs.mongodb.com/manual/tutorial/store-javascript-function-on-server/并添加一个返回日期的函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45102886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档