gpt4 book ai didi

MongoDB $where 查询和可尾游标——WAS : date math best practices

转载 作者:IT老高 更新时间:2023-10-28 12:30:16 24 4
gpt4 key购买 nike

我的问题:给我一份超过 X 时间的文档列表。

如果我创建了一个文档:

db.dates.insert({date: new Date()});

现在我只想在“日期”已经 30 分钟时找到它:

db.dates.find({ $where: "this.date.getTime() + 30 * 60000 <= new Date()"});

这可行,但在 Mongo 文档中非常清楚地表明 $where 查询会显着降低性能。

那么问题来了,有没有更好的办法?

==========更新1==========

我应该补充一点,我希望这个查询函数“动态地”创建一次查询并使用它来获取一个上限集合上的可尾游标......我不再确定它是实际上是可能的。

我会测试并重新发布。

==========更新2==========

所以,看起来我的“延迟”队列将不得不在代码中处理,或者使用轮询或一些“检查,然后休眠”算法,因为这似乎是 mongo 的延迟复制正在做的事情(来自 db. cpp):

if ( replSettings.slavedelay && ( unsigned( time( 0 ) ) < nextOpTime.getSecs() + replSettings.slavedelay ) ) {
assert( justOne );
oplogReader.putBack( op );
_sleepAdviceTime = nextOpTime.getSecs() + replSettings.slavedelay + 1;
dblock lk;
if ( n > 0 ) {
syncedTo = last;
save();
}
log() << "repl: applied " << n << " operations" << endl;
log() << "repl: syncedTo: " << syncedTo.toStringLong() << endl;
log() << "waiting until: " << _sleepAdviceTime << " to continue" << endl;
return okResultCode;
}

最佳答案

$lte 运算符(和其他范围查询)将工作并利用索引,但它不能评估表达式。您必须查询查询时间常数(即“现在 - 30 分钟”):

var threshold = new Date(); 
threshold.setMinutes(-30);

// now, query against a constant:
db.dates.find({"date" : {$lte : threshold}});

当然,您可以对任何编程语言的任何驱动程序执行相同的操作,例如 C#

var c = db.Collection.Find(Query.LTE("date", DateTime.UtcNow.AddMinutes(-30));

关于MongoDB $where 查询和可尾游标——WAS : date math best practices,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8389049/

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