Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在MongoDB数据库中查找更改_Javascript_Database Design_Mongodb - Fatal编程技术网

Javascript 在MongoDB数据库中查找更改

Javascript 在MongoDB数据库中查找更改,javascript,database-design,mongodb,Javascript,Database Design,Mongodb,我正在设计一个MongoDB数据库,它与一个脚本一起工作,该脚本定期轮询资源并返回存储在数据库中的响应。现在我的数据库有一个集合,包含四个字段,id,name,timestamp和data 我需要能够找出哪些名称在脚本运行期间的数据字段中发生了更改,哪些没有。 在伪代码中 if(data[name][timestamp]==data[name][timestamp+1]) //data has not changed store data in collection 1 else //data

我正在设计一个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的新集合?这会使它更快/更有条理吗?是否有更好的模式可以使用


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

好的,这是一个简洁的问题b/c基本上是:您必须迭代并在每个项目上运行javascript

这变得“整洁”的部分是,这与SQL解决方案必须做的事情没有什么不同。我的意思是,您基本上是将一个表连接到它自己,其中
x.1=x.1
y.1=y.2
。即使关系数据库可以处理这样一个问题,但它肯定不会很快处理数百万条条目

所以事实是,你这样做是对的。这里是额外的细节,我会用它来让这个更干净

  • 确保在名称/时间戳上有索引
  • 在数据集中运行db.mycollection.find().foreach()
  • 对于每个条目,您将执行比较b)适当保存c)更新指示此记录已处理的标志
  • 在将来加载时,您应该能够向查找中添加查询
    db.mycollection.find({flag:{$exists:false}}).foreach()
  • 使用
    db.eval()
    帮助提高速度
  • “Name/Timestamp”索引的原因是,您将通过“Name/Timestamp”查找每个“继任者”,因此您希望在这里快速查找

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


    老实说,如果你每天只跑一次,速度很可能会很好,特别是如果你只跑新记录的话。假设需要几分钟。

    好的,这是一个简洁的问题b/c基本上是:您必须迭代并在每个项目上运行javascript

    这变得“整洁”的部分是,这与SQL解决方案必须做的事情没有什么不同。我的意思是,您基本上是将一个表连接到它自己,其中
    x.1=x.1
    y.1=y.2
    。即使关系数据库可以处理这样一个问题,但它肯定不会很快处理数百万条条目

    所以事实是,你这样做是对的。这里是额外的细节,我会用它来让这个更干净

  • 确保在名称/时间戳上有索引
  • 在数据集中运行db.mycollection.find().foreach()
  • 对于每个条目,您将执行比较b)适当保存c)更新指示此记录已处理的标志
  • 在将来加载时,您应该能够向查找中添加查询
    db.mycollection.find({flag:{$exists:false}}).foreach()
  • 使用
    db.eval()
    帮助提高速度
  • “Name/Timestamp”索引的原因是,您将通过“Name/Timestamp”查找每个“继任者”,因此您希望在这里快速查找

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

    老实说,如果你每天只跑一次,速度很可能会很好,特别是如果你只跑新记录的话。假设需要几分钟