是否有任何选项可以使用猫鼬执行批量更新插入?那么基本上有一个数组并插入每个元素(如果不存在)或更新它(如果存在)? (我正在使用海关_ids)
当我使用时.insertMongoDB 针对重复键返回错误 E11000(应更新)。不过,插入多个新文档效果很好:
var Users = self.db.collection('Users');
Users.insert(data, function(err){
if (err) {
callback(err);
}
else {
callback(null);
}
});
Using .save返回参数必须是单个文档的错误:
Users.save(data, function(err){
...
}
这个答案建议没有这样的选项,但它是特定于 C# 的,而且已经有 3 年历史了。所以我想知道是否有任何选择可以使用猫鼬来做到这一点?
谢谢你!
具体来说不是“猫鼬”,或者至少在撰写本文时还没有。从 2.6 版本开始,MongoDB shell 实际上使用“批量操作API”就像所有通用辅助方法一样,“在引擎盖下”。在它的实现中,它首先尝试执行此操作,如果检测到旧版本服务器,则会“回退”到旧版实现。
所有猫鼬方法“当前”都使用“遗留”实现或写关注响应和基本遗留方法。但有一个.collection
来自任何给定猫鼬模型的访问器,本质上是从底层“节点本机驱动程序”访问“集合对象”,猫鼬是在该驱动程序上实现的:
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
});
});
主要的问题是“猫鼬方法”实际上意识到连接可能尚未真正建立,并“排队”直到连接完成。您正在“深入研究”的本机驱动程序不会做出这种区分。
因此,您确实必须意识到连接是以某种方式或形式建立的。但只要您小心所做的事情,您就可以使用本机驱动程序方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)