尝试插入子文档时出现MongoDB错误。子文档已经具有唯一的_id,但是对于另一个我不想唯一的非唯一字段抛出了错误。
Angular中的错误是:“ Assets.serial已存在”。 如何使该字段包含重复值,是什么导致模型假设它应该是唯一的?
这是我的猫鼬模型:
'use strict'; var mongoose = require('mongoose'), Schema = mongoose.Schema; var AssetUrlSchema = new Schema({ name: { type: String, unique: false, default: '', trim: true }, url: { type: String, unique: false, default: 'http://placehold.it/75x75', trim: true }, }), AssetSchema = new Schema({ serial: { type: Number, unique: false }, urls: { type: [AssetUrlSchema], unique: false, default: [ { name: '', url: 'http://placehold.it/75x75' }, { name: '', url: 'http://placehold.it/75x75' } ] } }), /** * Item Schema */ ItemSchema = new Schema({ name: { type: String, default: '', required: 'Please enter name', trim: true }, assets: { type: [AssetSchema], default: [], unique: false }, property: { type: Schema.ObjectId, zd: 'Please select a property', ref: 'Property' }, created: { type: Date, default: Date.now }, user: { type: Schema.ObjectId, ref: 'User' } }); mongoose.model('Item', ItemSchema);
这是我的“保存”方法:
function(){ var i = 0, assets = []; for (;i < 24;i++) { assets.push({ serial: 1000+i, urls: { name: 'Asset Name ' + i, url: 'http://placehold.it/75x75?' } }); } item = new Items ({ name: 'FPO', property: newPropId, assets: assets }); return item.$save( function(response){ return response; }, function(errorResponse) { $scope.error = errorResponse.data.message; } ); }
第一次插入文档时,它工作正常。任何后续时间,它都会失败并显示400,因为assets.serial字段不是唯一的。但是,我专门将该字段标记为unique:false。
模式控制台中的错误是:
{ [MongoError: insertDocument :: caused by :: 11000 E11000 duplicate key error index: mean-dev.items.$assets.serial_1 dup key: { : 1000 }] name: 'MongoError', code: 11000, err: 'insertDocument :: caused by :: 11000 E11000 duplicate key error index: mean-dev.items.$assets.serial_1 dup key: { : 1000 }' } POST /api/items 400 14.347 ms - 41
猫鼬不会删除现有索引,因此您需要显式删除该索引以摆脱它。在外壳中:
> db.items.dropIndex('assets.serial_1')
如果您最初定义该字段,unique: true但随后又将其从模式定义中删除或将其更改为,则会发生这种情况unique: false。
unique: true
unique: false