通过猫鼬进行批量操作

Man*_*edi 4 mongoose mongodb node.js promise

我希望通过mongoose在单个操作中存储批量数据(超过1000或10000条记录).但是Mongoose不支持批量操作,所以我将使用本机驱动程序(插入mongodb).我知道我会绕过所有的猫鼬中间件但是没关系.(如果我错了,请纠正我!:))

我可以选择按inset 方法存储数据.但是mongodb还提供Bulk类(顺序和无序操作).现在我有一些问题

  • insertbulk操作之间的区别(两者都可以存储批量数据)??
  • initializeUnorderedBulkOp()(操作串行执行)和initializeOrderedBulkOp()(操作并行执行)之间的任何特定差异?
  • 如果我将使用initializeUnorderedBulkOp它会影响范围搜索或任何副作用?
  • 我可以通过Promisification(蓝鸟)来做到这一点吗?(我正在尝试这样做.)

谢谢

编辑::我说的是关于多次插入的批量与插入.哪一个更好.通过批量生成器逐个插入或按插入方法按批次插入(1000).我希望现在它会清除 Mongoose(mongodb)批量插入?这个链接

Bla*_*ven 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
});
Run Code Online (Sandbox Code Playgroud)

这样做时你需要"小心".除了不受绑定到可以附加到mongoose模式的相同检查和验证之外,当您调用时,.collection您需要"确定"已经建立了与数据库的连接.Mongoose方法为您服务,但是一旦您使用底层驱动程序方法,您就可以独立完成.

至于差异,它在命名中都有:

  • Ordered:表示批处理指令的执行顺序与添加顺序相同.它们按顺序依次执行,一次执行一个.如果在任何时候发生错误,则停止执行批处理并返回错误响应.到那时为止的所有操作都是"有意"的.这不是回滚.

  • UnOrdered:表示批处理操作可以"任意"顺序执行,通常并行执行.这可以导致更快的更新,但当然不能在批处理中的一个批量操作要在另一个之前发生的情况下使用(例如上面的例子).发生的任何错误仅在结果中"报告",整个批处理将在发送到服务器时完成.

当然,标准方法中任一类型执行的核心差异在于,"整批"(实际上最多为1000个)被发送到服务器,您只能得到一个响应.这节省了网络流量并等待每个单独.insert()或类似的操作完成.

至于可以使用"promise",其他任何带有回调的东西,你可以转换为返回一个promise,遵循与此相同的规则.请记住,"回调/承诺"是在.execute()方法上,并且您获得的内容符合批量操作结果返回的规则.

有关更多信息,请参阅核心文档中的"批量".