我想通过mongoose在单个操作中存储批量数据(超过1000或10000条记录)。但是Mongoose不支持批量操作,所以我将使用本机驱动程序(插入mongodb)。我知道我会绕过所有的猫鼬中间件但是没关系。 (如果我错了,请纠正我!:))
我可以选择按inset
方法存储数据。但是mongodb还提供Bulk类(顺序和无序操作)。现在我有一些问题
insert
和bulk
操作之间的区别(两者都可以存储批量数据)?? initializeUnorderedBulkOp()
(连续执行操作)和initializeOrderedBulkOp()
(操作并行执行)之间的任何特定差异? initializeUnorderedBulkOp
那么它会通过范围搜索或任何副作用影响? 由于
编辑::我在谈论有关多次插入的批量与插入。哪一个更好。通过批量生成器逐个插入或按插入方法按批次插入(1000)。我希望现在它将清除Mongoose (mongodb) batch insert?这个链接
答案 0 :(得分:9)
如果您从猫鼬模型中调用此方法,则需要.collection
访问者
var bulk = Model.collection.initializeOrderedBulkOp();
// examples
bulk.insert({ "a": 1 });
bulk.find({ "a": 1 }).updateOne({ "$set": { "a": 2 } });
bulk.execute(function(err,result) {
// result contains stats of the operations
});
你需要小心谨慎"虽然这样做。除了没有绑定到可以附加到mongoose模式的相同检查和验证之外,当你致电.collection
时,你需要确保"确保"已经建立了与数据库的连接。 Mongoose方法为您服务,但是一旦您使用底层驱动程序方法,您就可以独立完成。
至于差异,它在命名中都有:
Ordered :表示批量指令的执行顺序与添加顺序相同。它们按顺序依次执行,一次执行一个。如果在任何时候发生错误,则停止执行批处理并返回错误响应。到那时为止的所有操作都是" comitted"。这是不回滚。
UnOrdered :表示批量操作可以在"任何"中执行。序列,通常是并行的。这可以导致更快的更新,但当然不能在批处理中的一个批量操作要在另一个之前发生的情况下使用(例如上面的例子)。发生的任何错误仅仅是"报告"在结果中,整批将在发送到服务器时完成。
当然,标准方法中任何一种执行方式的核心差异在于整个批次" (实际上最多1000个)被发送到服务器,你只得到一个回复。这样可以节省网络流量并等待每个单独的.insert()
或其他类似操作完成。
至于"承诺"使用,以及其他任何可以转换为返回promise的回调遵循与此处相同的规则。请记住,"回调/承诺"在.execute()
方法上,您获得的内容符合批量操作结果返回的规则。
有关详细信息,请参阅核心文档中的"Bulk"。