Mongoose批量更新操作

时间:2015-01-05 16:19:37

标签: javascript node.js mongodb mongoose

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

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

但是,当我这样做时,bulk未定义。它只是不被猫鼬支持吗?

3 个答案:

答案 0 :(得分:9)

  

注意:现代Mongoose直接在Model方法上发布支持.bulkWrite()。即使在MongoDB API的直接实现中也最好使用此方法,因为在连接到不支持“不支持”的MongoDB版本的情况下,它实际上“安全地降级”以使用批处理中提供的方法的“单独调用”。批量API“本身。

     

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

     

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


你可以这样做,但问题是当从基本驱动程序访问底层集合对象时,不会采用与实现的mongoose模型方法相同的预防措施。

所有模型方法都使用其他功能包装底层方法,但最常见的方法是在尝试访问方法之前确保数据库连接已打开。这可确保存在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)

});

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

对于批量API方法的原生支持而没有深入到底层驱动程序级别,是在目前的写作时正在进行的工作。但您仍然可以自己实现它,只要您连接到MongoDB 2.6服务器实例或更高版本,它就不会破坏代码。

答案 1 :(得分:3)

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

response = requests.get('http://localhost:81/proxy/bparc/my_key')
print len(response.text)

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

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

查询是搜索ID

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

答案 2 :(得分:0)

Person.collection.update(
  {'_id': id}, 
  {$set: {status: 'inactive'}}, 
  {multi: true}, 
  callback
)
{'_id': id} id中的

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

相关问题