我试图通过猫鼬在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
上却出现了重复。