mongoose批量更新操作
有没有办法对mongoose的集合进行批量更新? 我发现的策略使用原始收集驱动程序如下:
var bulk = Person.collection.initializeOrderedBulkOp(); bulk.find(query).update(update); ... bulk.execute(callback)
但是,当我这样做时, bulk
是不确定的。 它只是不被mongoose支持?
注意 :Modern Mongoose版本直接在Model方法上支持
.bulkWrite()
。 即使在MongoDB API的直接实现中,也最好使用这种方法,因为如果连接到不支持“mongodb”的MongoDB版本,它实际上会“安全降级”,以便在批处理中使用“个别调用”批量API“本身。它仍然调用所描述的相同的基本“批量方法”,但软件决定如何正确发送到服务器比你自己的代码需要做出这个决定。
另请注意:正在进行的mongoose版本现在要求您使用
.connect()
方式,这意味着在其他操作继续之前必须先parsing连接。 使用新的连接机制确保访问者(如下.collection
所述的.collection
在您调用它们时始终存在。
你可以做到这一点,但问题是,当从基础驱动程序访问底层集合对象时,与实施的mongoose模型方法不同,不会采取相同的预防措施。
所有的模型方法都将底层方法与其他function包装在一起,但最常见的方法是在尝试访问方法之前确保数据库连接已打开。 这确保存在一个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) });
或者其他一些基本上确保连接已经build立的方法。
至于批量API方法的本地支持,而没有潜入底层驱动程序级别,是的,目前正在写作。 但是,您仍然可以自己实现,只要连接到MongoDB 2.6服务器实例或更高版本,就不会破坏代码。
有关查询和更新查询的更详细的信息。
var bulk = Person.collection.initializeOrderedBulkOp(); bulk.find(query).update(update); bulk.execute(function (error) { callback(); });
查询正在用数组进行search。
更新需要一个$集
var bulk = Person.collection.initializeOrderedBulkOp(); bulk.find({'_id': {$in: []}}).update({$set: {status: 'active'}}); bulk.execute(function (error) { callback(); });
查询是一个searchID
var bulk = Person.collection.initializeOrderedBulkOp(); bulk.find({'_id': id}).update({$set: {status: 'inactive'}}); bulk.execute(function (error) { callback(); });
Person.collection.update( {'_id': id}, {$set: {status: 'inactive'}}, {multi: true}, callback )
在{'_id': id}
id是要更新的logging的id数组,实际上它是where子句,您可以设置自己的。 在{$set: {status: 'inactive'}}
status是你想要更新的字段,你可以指定你自己的字段为key:value对。 {multi: true}
指定此操作将更新多个logging。 callback
有成功更新后将被调用的方法。