insertMany中的猫鼬BulkwriteError

时间:2020-07-02 04:58:03

标签: javascript node.js mongoose

我试图通过猫鼬在mongodb中保存多个文档,但是有两个问题。

在保存文档之前,存在一个数组,数组的长度是固定的,并且将作为文档保存在mongodb中。

const results = [
  { obj }, 
  { obj },
  ...
]

我已如下附上obj的定义架构,以确保除_id之外没有其他任何明确定义的唯一键。

const resultSchema = new Schema({
  owner: {
    type: String,
    required: true,
  },
  createdAt: {
    type: String,
    default: function () {
      return moment
        .tz(new Date(), '')
        .format('YYYY-MM-DD HH:mm:ss');
    },
  },
  type: String,
  message: String,
  project: String,
  result: {
    ...
    specs: {
      ...
      length: String,
      width: String,
      height: String,
    },
  },
});

我将猫叫insertMany如下

import { Result } from "../model/result.js"

...

function saveResult(results, numResult) {
  // @results   array of result objects
  // @numResult number of array to save

  const minArr = [];
  for (let i = 0; i < numResult; i++) {
    minArr.push(results[i]);
  }

  if (minArr[0] === undefined || numResult > minArr.length) {
    throw new Error('');
  } else {
    await Result.insertMany(
      minArr,
      function (error, docs) {
        if (error) {
          throw new Error(error);
        }
      },
    );
  }

我还有2个问题。

问题1。minArr未被正确推送(与mongoose不相关)

预期:按results的数量将minArr的元素推到numResult 实际:results的所有元素都独立于minArr被推到numResult

function saveResult(results, numResult) {
  ...
  const minArr = [];

  console.log(minArr.length); // = 0

  for (let i = 0; i %lt; numResult; i++) {
    minArr.push(results[i]);
  }

  console.log(minArr.length); // = numResult

  if (minArr[0] === undefined || numResult > minArr.length) {
    throw new Error('');
  } else {
    await Result.insertMany(
      minArr, // = results (!)
      function (error, docs) {
        console.log(minArr.length) // = numResult
        if (error) {
          throw new Error(error);
        }
      },
    );
  }

问题2。insertMany中的键重复(与mongoose相关)

minArr中有大约5个以上的元素时,insertMany回调会引发重复键错误,如下所示:

Error: BulkWriteError: E11000 duplicate key error collection: test.results index: _id_ dup key: { _id: ObjectId('5efd339fdf3c8f353be0e2b9') }
at ...

但是,除了mongodb中的_id之外,我的架构没有隐式唯一键。 我已经检查过db.Collection.getIndexes(),并且只有一个键_id,但是在insertMany上却出现了重复。

0 个答案:

没有答案