Node.js 通过循环中的单个文档更新查询进行多文档更新

Node.js 通过循环中的单个文档更新查询进行多文档更新,node.js,mongodb,express,mongoskin,Node.js,Mongodb,Express,Mongoskin,我正在使用Mongoskin在Node/Express/MongoDB中构建一个应用程序。 在这个应用程序中,有一个预定的功能,在每个月初运行 此功能由以下代码组成: clients.find({}, {cost: 1, invoices: 1 }).toArray(function(err, dbDocs) { if (err) throw err; // Set up a current time variable and a general populated invoice

我正在使用Mongoskin在Node/Express/MongoDB中构建一个应用程序。 在这个应用程序中,有一个预定的功能,在每个月初运行

此功能由以下代码组成:

clients.find({}, {cost: 1, invoices: 1 }).toArray(function(err, dbDocs) {
  if (err) throw err; 

  // Set up a current time variable and a general populated invoice object.
  var currentTime = new Date();
  var invoice = {
    year: currentTime.getFullYear(), 
    quarter: Math.floor(currentTime.getMonth() / 3) + 1, 
    paid: false
  };

  // Loop trough the fetched documents.
  for (var i = 0, j = dbDocs.length; i < j; i += 1) { 
    invoice.quarterCost = (dbDocs[i].cost.monthly * 3);

    clients.update({_id:dbDocs[i]._id}, {$push:{ invoices: invoice }}, function(err, result) {
      if (err) throw err; 

      console.log('LogCost created new client invoice')
    ));
  }
});
clients.find({},{cost:1,invoices:1}).toArray(函数(err,dbDocs){
如果(错误)抛出错误;
//设置当前时间变量和一般填充的发票对象。
var currentTime=新日期();
var发票={
年份:currentTime.getFullYear(),
季度:Math.floor(currentTime.getMonth()/3)+1,
支付:假
};
//通过获取的文档进行循环。
对于(var i=0,j=dbDocs.length;i
此函数首先从数据库中查询所有可用的客户机文档,然后使用此数据为每个客户机创建一个新的发票对象,然后将此发票推送到客户机发票数组中,并将其保存到数据库中

现在我有一个循环中的更新,这意味着当有许多客户端需要更新时,将有许多单个更新查询。我预计不会超过100-200个客户端

问题:是否有更好的方法来构造此函数及其更新查询?
困扰我的是循环中的单个文档更新查询…但也许这是正确的方法。

对于每月运行一次的文档数如此之少的情况来说,这似乎很好。除非您有特定的性能问题,否则这似乎是过早的优化。好吧,但如果我想优化它,原则上我该如何做?如何优化?你想牺牲可靠性、写保证等吗?正如你所看到的,你正在进行的更新类型需要对
update
进行单独调用。几个单独调用的主题是我问题的核心。是否有一种方法只需一次mongoDB调用就可以进行此更新,或者使用sev提交某种数组要添加到多个不同的客户端文档的eral invoice对象。但这似乎不可能。正如我所说,您正在执行的更新类型需要单独调用。