使用空子文档集合保存Mongoose文档会导致重复键错误

Vik*_*eev 8 javascript mongoose mongodb node.js

我有两个猫鼬模式:

var productSchema = new Schema({
    name: { type: String, required: true, unique: true },
    ...
});
...
var categorySchema = new Schema({
    ...
    products: [ProductSchema]
});
Run Code Online (Sandbox Code Playgroud)

当我尝试保存类别时

var categories = [
    {..., products: []},
    {..., products: []}
];
Run Code Online (Sandbox Code Playgroud)

甚至没有产品

var categories = [
    {...},
    {...}
];
Run Code Online (Sandbox Code Playgroud)

我收到了错误

{ [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 }
Run Code Online (Sandbox Code Playgroud)

似乎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' }) {}  
Run Code Online (Sandbox Code Playgroud)

如果我从productSchemaname属性中删除unique:true,则会添加两个类别与空products []集合.

我究竟做错了什么?

谢谢!

Nei*_*unn 13

这真的很正常.空数组基本上被认为是"products.name"字段的"null"值,当然这违反了索引的唯一约束.

您实际上可以"跳过"实际上未定义的"名称"的任何值,并通过向索引添加"稀疏"属性来执行此操作.在当前架构路径形式中:

var productSchema = new Schema({
  name: { type: String, required: true, unique: true, sparse: true }
});

var categorySchema = new Schema({
  products: [productSchema]
});
Run Code Online (Sandbox Code Playgroud)

现在,只要"名称"中没有值,就没有问题,除非它当然存在于某个地方.确保首先删除已创建的索引.

请注意,请注意,这样做是为了确保"products.name"值对于"整个"集合是唯一的.如果您只是想确保它们对于给定类别是唯一的,那么索引不是您的解决方案,您需要通过其他方式确保.