Mongoose批量插入或更新文档

3
我正在开发一个node.js应用程序,想要绕过Model.save()函数,因为我想同时保存多个文档,这样一个一个地处理和网络传输会很浪费资源。
我找到了一种批量插入的方法。然而,我的模型有两个独特的属性(ID和HASH),我从API获取这些信息,我认为需要这两个信息来使文档唯一。所以,如果我获得了一个已经存在的对象,它应该被更新而不是插入到模式中。
有没有办法做到这一点?我读到了关于使用Q并发调用保存对象的内容,但我仍然认为这会给Mongo服务器带来不必要的负荷,不是吗?Mongo或Mongoose是否有像插入操作那样的批量插入或更新方法?
先谢谢你。
1个回答

4
我认为您正在寻找 Bulk.find(<query>).upsert().update(<update>) 函数。
您可以这样使用它:
bulk = db.yourCollection.initializeUnorderedBulkOp();
for (<your for statement>) {
    bulk.find({ID: <your id>, HASH: <your hash>}).upsert().update({<your update fields>});
}
bulk.execute(<your callback>)

针对每个文档,它将寻找一个符合{ID: <your id>, HASH: {your hash}}条件的文档。然后:
  • 如果找到了一个文档,则使用{<your update fields>}更新该文档
  • 否则,它将创建一个新文档
根据您的需求,在for循环的每次迭代中不会与mongo服务器建立连接。相反,在bulk.execute()行上只会进行一次调用。

稍后我会测试一下。非常感谢!看起来这正好符合我的需求。 - Uriel Bertoche
谢谢,它几乎像魔法一样奏效了。我确认它正在插入或更新数据库,但是在bulk.execute完成后,我遇到了一个错误并且我的服务器崩溃了。你能否看一下,看看你知道发生了什么?这是错误信息:http://pastebin.com/SgYe4b3X - Uriel Bertoche
搞定了。execute调用缺少回调函数。bulk.execute(callback)解决了问题,其中callback是一个函数。 - Uriel Bertoche
谢谢你,我已经根据你的评论更新了答案。 - bagrat
显然,现在使用.insertMany是正确的方法?https://github.com/Automattic/mongoose/issues/3122#issuecomment-117232568 但是,我还没有找到一个好的方法来处理具有唯一键的文档的更新。 - Aaron Ash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接