查找MongoDB数据库中的更改

时间:2010-06-07 00:08:36

标签: javascript database-design mongodb

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

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

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 的新集合?这会让它变得更快/更有条理吗?是否有更好的架构可以使用?

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

1 个答案:

答案 0 :(得分:1)

好的,这是一个简洁的问题b / c基本上是短的:你必须迭代并在每个项目上运行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()来提高速度。
  6. “名称/时间戳”索引的原因是您将通过“名称/时间戳”查找每个“后继者”,因此您希望在这里快速。

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

    老实说,如果你每天只运行一次,那么速度很可能就好了,特别是如果你只运行新的记录。假设它需要几分钟。