我正在设计一个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 的新集合?这会让它变得更快/更有条理吗?是否有更好的架构可以使用?
该脚本每天运行一次,因此我不会很快遇到名称空间限制。
答案 0 :(得分:1)
好的,这是一个简洁的问题b / c基本上是短的:你必须迭代并在每个项目上运行javascript 。
这个“整洁”的部分是,这与SQL解决方案必须做的事情没有什么不同。我的意思是,你基本上是在x.1=x.1
和y.1=y.2
加入一张桌子。即使关系数据库可以处理这样的野兽,它肯定不会有数百万条目快速。
事实是,你正在以正确的方式行事。以下是我用来制作清洁剂的额外细节。
db.mycollection.find().foreach()
。db.mycollection.find({flag:{$exists:false}}).foreach()
db.eval()
来提高速度。“名称/时间戳”索引的原因是您将通过“名称/时间戳”查找每个“后继者”,因此您希望在这里快速。
“已处理”标志的原因是您永远不必重新运行相同的项目。如果给定时间戳'n',你会发现'n + 1',那么这就是你将要拥有的唯一'n + 1'。
老实说,如果你每天只运行一次,那么速度很可能就好了,特别是如果你只运行新的记录。假设它需要几分钟。