回送-如何使用bulkUpdate方法

时间:2018-07-07 06:05:31

标签: rest loopback

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

如何根据文档中提到的updates方法创建createUpdates()数组?有人可以帮我举一个使用此方法的简单示例吗?

1 个答案:

答案 0 :(得分: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