在mongo中高效的多文档upsert

时间:2015-05-11 10:03:55

标签: node.js mongodb mongoose

我有一个node.js应用程序,用于从远程API更新本地mongo(3.0)数据存储,我试图尽可能提高效率。

集合中的每条记录都有一个唯一的remoteId属性。调用API后,我得到一组记录。然后我应该使用新属性更新本地文档,其中已经存在匹配remoteId的文件,插入不存在的文件,并将本地存在但不存在于远程数据集中的文档标记为非活动。

我目前的解决方案就是这个(猫鼬代码,为了清晰起见,删除了回调/承诺,假设它同步运行):

timestamp = new Date
for item in remoteData
  collection.findOneAndUpdate { remoteId: item.remoteId }, { updatedAt: timestamp, /* other properties */ }, { upsert: true }
collection.update { updatedAt: { $lt: timestamp} }, { active: false }, { multi: true }

看起来很简单。但是在处理成千上万的文档时,它会变得非常慢。

我从mongo文档中查看了Bulk.upsert,但这似乎仅在您的文档查找是静态时才有效。

我能在这做什么?

1 个答案:

答案 0 :(得分:0)

原来我没有完全掌握mongo Bulk api - 我错过了它基本上是一组命令,当你打电话给execute时,它会被发送到数据库。最后,这就是我必须要做的事情:

timestamp = new Date
bulkOp = collection.initializeUnorderedBulkOp()
for item in remoteData
  bulkOp.find({ remoteId: item.remoteId }).upsert().updateOne { updatedAt: timestamp, /* other properties */ }
bulkOp.execute()
collection.update { updatedAt: { $lt: timestamp} }, { active: false }, { multi: true }