【问题标题】:Mongoose bulk insert or update documentsMongoose 批量插入或更新文档
【发布时间】:2015-10-20 17:43:54
【问题描述】:

我正在开发一个 node.js 应用程序,我一直在寻找使用 Model.save() 函数的方法,因为我想同时保存许多文档,所以这将是一种浪费网络和处理一一进行。

我找到了一种批量插入的方法。但是,我的模型有两个使它们唯一的属性,一个 ID 和一个 HASH(我从 API 获取此信息,所以我相信我需要这两个信息来使文档唯一),所以,如果我得到一个已经存在的对象,它将被更新而不是插入到架构中。

有没有办法做到这一点?我正在阅读有关使用 Q 进行并发调用以保存对象的内容,但是我仍然认为这会在 Mongo 服务器上产生不必要的负载,不是吗? Mongo 或 Mongoose 是否有像 insert 那样批量插入或更新的方法?

提前致谢

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    我认为您正在寻找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: &lt;your id&gt;, HASH: {your hash}} 条件的文档。那么:

    • 如果找到,它将使用{&lt;your update fields&gt;} 更新该文档
    • 否则,它将创建一个新文档

    根据您的需要,它不会在 for 循环的每次迭代中连接到 mongo 服务器。而是在bulk.execute() 线路上进行一次调用。

    【讨论】:

    • 稍后会对此进行测试。多谢!看来这正是我想要的。
    • 谢谢,它几乎就像一个魅力。我确认将其插入或更新到数据库中,但是,在 bulk.execute 完成后立即出现错误并且我的服务器崩溃。你能看看你是否知道发生了什么?这是错误消息:pastebin.com/SgYe4b3X
    • 想通了。缺少执行调用的回调。 bulk.execute(callback) 解决了,回调是一个函数
    • 也谢谢你,我已经根据你的评论更新了答案。
    • 显然.insertMany 是现在要走的路吗? github.com/Automattic/mongoose/issues/… 但是,我还没有找到一种处理具有唯一键的文档更新的好方法
    猜你喜欢
    • 2019-07-09
    • 2020-12-21
    • 2016-05-02
    • 2011-09-11
    • 2012-03-19
    • 1970-01-01
    • 2014-10-06
    • 2018-01-13
    • 2018-01-02
    相关资源
    最近更新 更多