我有两个猫鼬模式:
var productSchema = new Schema({
name: { type: String, required: true, unique: true },
...
});
...
var categorySchema = new Schema({
...
products: [ProductSchema]
});
当我尝试保存类别时
var categories = [
{..., products: []},
{..., products: []}
];
甚至没有产品
var categories = [
{...},
{...}
];
我收到错误
{ [MongoError: E11000 duplicate key error index: test.categories.$products.name_1 dup key: { : undefined }]
name: 'MongoError',
err: 'E11000 duplicate key error index: test.categories.$products.name_1 dup key: { : undefined }',
code: 11000,
n: 0,
lastOp: { _bsontype: 'Timestamp', low_: 6, high_: 1404282198 },
ok: 1 }
似乎mongoose正在尝试使用未发现的名称来保存产品。
收到错误之前的Mongoose日志:
Mongoose: categories.insert({ __v: 0, products: [], _id: ObjectId("53b3c167d28a86102dec420a"), order: 1, description: 'Category 1', name: 'Cat 1' }) {}
Mongoose: categories.insert({ __v: 0, products: [], _id: ObjectId("53b3c167d28a86102dec420b"), order: 2, description: 'Category 2', name: 'Cat 2' }) {}
如果我从 productSchema 的 name 属性中删除 unique:true ,则会添加两个类别,其中包含空产品 [] collections。
我做错了什么?
谢谢!
答案 0 :(得分:12)
这真的很正常。空数组基本上被认为是" null" " products.name"的价值字段,当然违反了对索引的唯一约束。
你基本上可以"跳过"任何" name"的值实际上是未定义的,你可以通过添加"稀疏"财产到索引。在当前架构路径表单中:
var productSchema = new Schema({
name: { type: String, required: true, unique: true, sparse: true }
});
var categorySchema = new Schema({
products: [productSchema]
});
现在,只要" name"没有问题,除非它当然存在于某个地方。确保首先删除已经创建的索引。
请注意,请注意,这样做是为了确保" products.name"值对于"整体"是唯一的。采集。如果您只是想确保它们对于给定类别是唯一的,那么索引不是您的解决方案,您需要通过其他方式确保索引。