gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 04:07:06 25 4
gpt4 key购买 nike

我有两个 Mongoose 模式:

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

如果我从 productSchemaname 属性中删除 unique: true,则会添加两个带有空产品的类别 [] 集合。

我做错了什么?

谢谢!

最佳答案

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

您基本上可以“跳过”实际上未定义的“name”的任何值,您可以通过将“sparse”属性添加到索引来实现。在当前模式路径形式中:

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

var categorySchema = new Schema({
products: [productSchema]
});

现在只要“名称”中没有值就没有问题,除非它确实存在于某处。不过,请务必先删除已创建的索引。

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

关于javascript - 使用空子文档集合保存 Mongoose 文档会导致重复键错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24524639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com