【问题标题】:Meteor.js: MongoDB bulk/batch UpsertMeteor.js:MongoDB 批量/批量 Upsert
【发布时间】:2014-07-17 09:32:52
【问题描述】:

我已经在互联网上搜索了几个小时,以寻找在 Meteor.js 的智能集合中进行批量 upsert 有效的解决方案。

场景:

我正在使用 api 每 12 小时异步获取 200 个属性的更新信息。对于每个属性,我平均得到一个包含大约 300 个 JSON 对象的数组。 70% 的对象可能尚未更新。但对于其余 30% 的对象,我需要在数据库中更新它们。由于如果不将它们与数据库中的文档匹配就无法找到这 30% 的对象,因此我决定更新所有文档。

我的选择:

  1. 在对象数组上运行一个循环并更新数据库中的每个文档。
  2. 从集合中删除所有文档并批量插入新对象。

对于选项 1,运行循环并更新 60K 文档(将随着时间的推移而增加),需要很多时间。但目前似乎是唯一可行的选择。

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

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

【问题讨论】:

    标签: mongodb meteor bulkinsert upsert smartcollection


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      MongoDb 支持插入文档数组。因此,您可以在 Meteors 'rawCollection' 的一次调用中插入所有文档。

      MyCollection.remove({}); // its empty
      
      var theRaw = MyCollection.rawCollection();
      var mongoInsertSync = Meteor.wrapAsync(theRaw.insert, theRaw);
      var result = mongoInsertSync(theArrayOfDocs);
      

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

      【讨论】:

        猜你喜欢
        • 2021-01-07
        • 1970-01-01
        • 2017-03-20
        • 2014-10-22
        • 1970-01-01
        • 2016-04-03
        • 2016-03-30
        • 2017-12-20
        • 1970-01-01
        相关资源
        最近更新 更多