我有一个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,但这似乎仅在您的文档查找是静态时才有效。
我能在这做什么?
答案 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 }