是否有任何选项可以使用 mongoose 执行批量 upserts?所以基本上有一个数组,如果它不存在则插入每个元素,或者如果它存在则更新它? (我正在使用海关_ids)
当我使用 .insert 时,MongoDB 会为重复键返回错误 E11000(应该更新)。插入多个新文档可以正常工作:
var Users = self.db.collection('Users');
Users.insert(data, function(err){
if (err) {
callback(err);
}
else {
callback(null);
}
});
使用.save会返回参数必须是单个文档的错误:
Users.save(data, function(err){
...
}
This answer建议没有这样的选项,但是它特定于 C# 并且已经 3 岁了。所以我想知道是否有任何选择可以使用 Mongoose 来做到这一点?
谢谢!
最佳答案
没有具体在“ Mongoose ”中,或者至少在撰写本文时还没有。 2.6 版本的 MongoDB shell 实际上使用 "Bulk operations API" “在引擎盖下”,因为它适用于所有通用辅助方法。在它的实现中,它首先尝试执行此操作,如果检测到旧版本的服务器,则会“回退”到旧的实现。
“当前”的所有 mongoose 方法都使用“旧版”实现或写入关注响应和基本的旧版方法。但是任何给定的 mongoose 模型都有一个 .collection
访问器,它本质上是从实现 mongoose 的底层“Node native 驱动程序”访问“集合对象”:
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
mongoose.connect('mongodb://localhost/test');
var sampleSchema = new Schema({},{ "strict": false });
var Sample = mongoose.model( "Sample", sampleSchema, "sample" );
mongoose.connection.on("open", function(err,conn) {
var bulk = Sample.collection.initializeOrderedBulkOp();
var counter = 0;
// representing a long loop
for ( var x = 0; x < 100000; x++ ) {
bulk.find(/* some search */).upsert().updateOne(
/* update conditions */
});
counter++;
if ( counter % 1000 == 0 )
bulk.execute(function(err,result) {
bulk = Sample.collection.initializeOrderedBulkOp();
});
}
if ( counter % 1000 != 0 )
bulk.execute(function(err,result) {
// maybe do something with result
});
});
主要的问题是“ Mongoose 方法”实际上知道连接可能尚未真正建立,并且“排队”直到完成。您正在“挖掘”的 native 驱动程序没有这种区别。
因此,您确实必须意识到连接是以某种方式或形式建立的。但是你可以使用 native 驱动方法,只要你小心你在做什么。
关于javascript - 使用 mongoose 在 MongoDB 中批量更新插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25285232/