【问题标题】:Loopback - How to use bulkUpdate methodLoopback - 如何使用 bulkUpdate 方法
【发布时间】:2018-12-15 15:43:51
【问题描述】:

我目前正在使用 Loopback v3,并且想在一个集合中一次插入多条记录;我从文档 (http://apidocs.loopback.io/loopback/#persistedmodel-bulkupdate) 中找到了这种方法 bulkUpsert,但我不知道如何使它起作用。

如何根据文档中提到的createUpdates() 方法创建updates 数组?谁能帮我举一个使用这种方法的简单例子吗?

【问题讨论】:

    标签: rest loopback


    【解决方案1】:

    还有另一种方法可以执行 bulkUpdate 方法,可在 Stackoverflow 中找到 MongoDB aggregation on Loopback

    可以在模型上轻松创建和重用 mixin。我的 bulkUpsert mixin 示例代码如下:

    Model.bulkUpsert = function(body, cb) {
        try {
          Model.getDataSource().connector.connect(async (err, db) => {
            if (err) {
              return cb(err);
            }
    
            // Define variable to hold the description of the first set of validation errors found
            let validationErrors = '';
    
            // Build array of updateOne objects used for MongoDB connector's bulkWrite method
            const updateOneArray = [];
    
            // Loop through all body content and stop the loop if a validation error is found
            const hasError = body.some(row => {
              // Check if it is a valid model instance
              const instance = new Model(row);
              if (!instance.isValid()) {
                // A validation error has been found
                validationErrors = JSON.stringify(instance.errors);
                // By returning true we stop/break the loop
                return true;
              }
    
              // Remove ID in the row
              const data = JSON.stringify(row);
              delete data.id;
    
              // Push into the update array
              updateOneArray.push({
                updateOne: {
                  filter: { _id: row.id },
                  update: { $set: Object.assign({ _id: row.id }, data) },
                  upsert: true
                }
              });
    
              // No validation error found
              return false;
            });
    
            // Check if a validation error was found while looping through the body content
            if (hasError) {
              return cb(new Error(validationErrors));
            }
    
            // No validation data error was found
            // Get database collection for model
            const collection = db.collection(Model.name);
            // Execute Bulk operation
            return collection.bulkWrite(updateOneArray, {}, (err, res) => {
              // Check if the process failed
              if (err) {
                console.err('The bulk upsert finished unsuccessfully', err);
                return cb(err);
              }
    
              // Check if there were errors updating any record
              if (res.hasWriteErrors()) {
                console.error(`The bulk upsert had ${res.getWriteErrorCount()} errors`, res.getWriteErrors());
              }
    
              // Finished successfully, return result
              return cb(null, {
                received: body.length,
                handled: res.upsertedCount + res.insertedCount + res.matchedCount
              });
            });
          });
        }
        catch (err) {
          console.error('A critical error occurred while doing bulk upsert', err);
          return cb(err);
        }
        return null;
      };
    

    参考:Mongodb query documentation

    【讨论】:

      猜你喜欢
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 2016-12-17
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      相关资源
      最近更新 更多