gpt4 book ai didi

javascript - 查找 MongoDB 数据库中的更改

转载 作者:行者123 更新时间:2023-11-28 02:54:38 24 4
gpt4 key购买 nike

我正在设计一个 MongoDB 数据库,该数据库与一个脚本配合使用,该脚本定期轮询资源并获取存储在数据库中的响应。现在,我的数据库有一个包含四个字段的集合:idnametimestampdata

我需要能够找出脚本运行之间数据字段中哪些名称发生了变化,哪些没有。在伪代码中,

if(data[name][timestamp]==data[name][timestamp+1]) //data has not changed
store data in collection 1
else //data has changed between script runs for this name
store data in collection 2

是否有一个查询可以执行此操作,而无需对集合中的每个项目迭代和运行 javascript?有数百万个文档,所以这会很慢。

我应该在每次脚本运行时创建一个名为timestamp的新集合吗?这会让事情变得更快/更有组织吗?是否有更好的架构可以使用?

该脚本每天运行一次,因此我不会很快遇到命名空间限制。

最佳答案

好的,这是一个很好的问题,简单来说就是:你必须在每个项目上迭代并运行 javascript

这变得“简洁”的地方在于,这与 SQL 解决方案必须做的事情并没有真正的不同。我的意思是,您基本上是将一个表连接到其自身,其中 x.1=x.1y.1=y.2。即使关系数据库可以处理这样的庞然大物,但处理数百万个条目时它的速度肯定不会很快。

事实是,您的做法是正确的。以下是我用来使其更清晰的额外细节。

  1. 确保您有名称/时间戳索引。
  2. 在数据集上运行 db.mycollection.find().foreach()
  3. 对于每个条目,您要a)执行比较。 b) 适当保存。 c) 更新一个标志,表明该记录已被处理。
  4. 在将来加载时,您应该能够向查找结果添加查询。 db.mycollection.find({flag:{$exists:false}}).foreach()
  5. 使用 db.eval() 来提高速度。

“名称/时间戳”索引的原因是您将通过“名称/时间戳”查找每个“后继者”,因此您希望在这里快速。

“已处理”标志的原因是您永远不必重新运行相同的项目。如果给定时间戳“n”,您找到“n+1”,那么这就是您将拥有的唯一“n+1”。

老实说,如果您每天只运行一次,那么速度很可能会很好,特别是如果您只在新记录上运行的话。假设这需要几分钟。

关于javascript - 查找 MongoDB 数据库中的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2986457/

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