Meteor.js:MongoDB批量/批量Upsert

时间:2014-05-28 08:50:33

标签: mongodb meteor bulkinsert upsert smartcollection

我一直在互联网上搜索几个小时来查看一个解决方案,在Meteor.js的智能集合中进行批量upsert是有效的。

情境:

我正在点击api以每12小时异步获取200个属性的更新信息。对于每个属性,我得到一个平均大约300个JSON对象的数组。 70%的对象可能尚未更新。但是对于剩余的30%对象,我需要在数据库中更新它们。由于没有办法找到那些30%的对象而没有将它们与数据库中的文档相匹配,我决定将所有文档都插入。

我的选择:

  1. 在对象数组上运行循环并在数据库中插入每个文档。
  2. 从集合中删除所有文档并批量插入新对象。
  3. 对于运行循环并挂起60K文档的选项1(随着时间的推移而增加),需要花费大量时间。但目前似乎是唯一可行的选择。

    对于选项2,meteor.js不允许在其智能集合中进行批量插入。即便如此,我们也必须遍历对象数组。

    还有其他选择我可以有效地实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

MongoDb支持插入文档数组。因此,您可以在Meteors' rawCollection'的一个电话中插入所有文件。

MyCollection.remove({}); // its empty

var theRaw = MyCollection.rawCollection();
var mongoInsertSync = Meteor.wrapAsync(theRaw.insert, theRaw);
var result = mongoInsertSync(theArrayOfDocs);

在生产代码中,如果插入失败,你将把它包装在try / catch中以获取错误,只有插入文档数组成功才能获得结果。

答案 1 :(得分:0)

带有rawCollection的上述解决方案确实插入,但似乎不支持ordered:false指令继续处理如果一个文档失败,则原始集合退出第一个错误,这是不幸的。

“如果为false,则执行无序插入,如果其中一个文档发生错误,请继续处理数组中的其余文档。”