Mongo在非唯一字段上给“重复键错误”

尝试插入子文档时遇到MongoDB错误。 这个subdocs已经有了唯一的_ids,但是对于一个我不想要唯一的不同的,非唯一的字段却抛出了一个错误。

Angular中的错误是:“Assets.serial already exists”。 我怎样才能使这个领域包含重复的价值观,是什么导致模型假设它应该是唯一的?

这是我的mongoose模型:

'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; } ); } 

我第一次插入一个文件,它工作正常。 随后的任何时候,它都会失败,因为assets.serial字段不是唯一的。 但是,我特别指出这个领域是独一无二的:错误的。

模式控制台中的错误是:

 { [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 

mongoose不会删除现有的索引,所以你需要明确地删除索引摆脱它。 在shell中:

 > db.items.dropIndex('assets.serial_1') 

如果您最初将该字段定义为unique: true ,则会发生这种情况unique: true但稍后将其从模式定义中删除,或将其更改为unique: false