【问题标题】:Mongoose bulk update operation猫鼬批量更新操作
【发布时间】:2015-03-03 05:30:40
【问题描述】:

有没有办法在 mongoose 中对集合进行批量更新?我发现的策略使用原始收集驱动程序如下:

var bulk = Person.collection.initializeOrderedBulkOp();
bulk.find(query).update(update);
...
bulk.execute(callback)

但是,当我这样做时,bulk 是未定义的。 mongoose不支持吗?

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:
    Person.collection.update(
      { '_id': id }, 
      { $set: { status: 'inactive' } },
      { multi: true },
      callback
    )
    

    {'_id': id}中的id是要更新的记录的id数组,其实就是where子句,你可以自己设置。在{$set: {status: 'inactive'}} status 是您要更新的字段,您可以将自己的字段指定为键:值对。 {multi: true} 指定此操作将更新多条记录。 callback有更新成功后调用的方法。

    【讨论】:

    • 您能否在您的代码中添加一些解释,以便读者更好地理解您建议的更改。
    【解决方案2】:

    有关查询和更新查询的更多详细信息。

    var bulk = Person.collection.initializeOrderedBulkOp();
    bulk.find(query).update(update);
    bulk.execute(function (error) {
       callback();                   
    });
    

    查询正在使用数组进行搜索。
    更新需要$set

    var bulk = Person.collection.initializeOrderedBulkOp();
    bulk.find({ '_id': { $in: [] } }).update({ $set: { status: 'active' } });
    bulk.execute(function (error) {
         callback();                   
    });
    

    查询是搜索id

    var bulk = Person.collection.initializeOrderedBulkOp();
    bulk.find({ '_id': id }).update({ $set: { status: 'inactive' } });
    bulk.execute(function (error) {
         callback();                   
    });
    

    【讨论】:

    • 这对我不起作用,我总是将 nMatched nModified 设为 '0'。可能的原因是什么?这是我的查询
    【解决方案3】:

    注意:Modern Mongoose 版本直接在 Model 方法上支持 .bulkWrite()。即使在 MongoDB API 的直接实现中也最好使用此方法,因为在连接到不支持“批量 API”本身。

    它仍然调用与描述相同的底层“批量方法”,而是由软件决定如何正确发送到服务器,而不是您自己的代码需要做出此决定。

    另请注意:正在进行的 mongoose 版本现在要求您.connect(),这意味着连接必须在其他操作继续之前解决。使用新的连接机制可确保当您调用它们时,如下所述的.collection 等访问器始终存在。


    您可以这样做,但问题是当从基本驱动程序访问底层集合对象时,没有采取与实施的猫鼬模型方法相同的预防措施。

    所有模型方法都使用其他功能包装底层方法,但最常见的是在尝试访问该方法之前确保数据库连接已打开。这确保了Db 实例存在并且可以获取Collection() 对象

    一旦您在模型上使用了.collection 访问器,那么您就可以自己完成这一切:

    mongoose.connection.on('open',function(err,conn) {
    
       // now it's safe to use
    
       // { .. } Other code
       var bulk = Person.collection.initializeOrderedBulkOp();
       bulk.find(query).update(update);
       bulk.execute(callback)
    
    });
    

    或其他一些基本上可以确保实际建立连接的方法。

    至于在不深入底层驱动程序级别的情况下对 Bulk API 方法的本机支持,是的,目前正在研究中。但是您仍然可以自己实现它,只要您连接到 MongoDB 2.6 服务器实例或更高版本,它就不会破坏代码。

    【讨论】:

    • @bikash 如果您还有其他问题,那么Ask another question。这回答了“为什么”“驱动程序特定方法”不触发以及如何确保它们触发的原因。所有 mongoose Model 方法实际上在发出之前检查要连接的数据库,然后“排队”操作直到它实际连接。
    猜你喜欢
    • 2015-01-13
    • 2013-05-19
    • 2012-03-28
    • 2018-05-14
    • 1970-01-01
    • 2023-03-29
    • 2013-06-29
    相关资源
    最近更新 更多