gpt4 book ai didi

mongodb - Mongo 稀疏索引未按预期工作

转载 作者:行者123 更新时间:2023-12-05 01:20:08 25 4
gpt4 key购买 nike

我说“如我所料”,因为我可能误解了它应该如何工作。

我有一个包含像这样的对象的模型:

{
"_id" : ObjectId("56408d76ef82679937000008"),
"_type" : "ford",
"year" : 1986,
"model" : "sierra",
"model_unique" : 1,
"__v" : 0
}

我需要一个复合唯一索引,除非指定,否则不允许插入具有相同 _typemodel 组合的两个对象。

我认为我可以指定的方式是使用 model_unique 列并使索引稀疏,因此两次添加前一个文档应该会失败,而以下应该是允许的(注意有没有 model_unique 字段):

{
"_id" : ObjectId("56408e0d636779c83700000a"),
"_type" : "veridianDynamics",
"year" : 1986,
"model" : "sierra",
"__v" : 0
}
{
"_id" : ObjectId("another ID"),
"_type" : "veridianDynamics",
"year" : 2003,
"model" : "sierra",
"__v" : 0
}

我认为这适用于此索引:

Schema.index({"_type": 1, "model": 1, "model_unique": 1}, { unique: true, sparse: true });

但它实际上失败了:

[MongoError: insertDocument :: caused by :: 11000 E11000 duplicate key error index: mongoose-schema-extend.vehicles.$_type_1_model_1_model_unique_1  dup key: { : "veridianDynamics", : "sierra", : null }]

显然它正在考虑未定义的字段具有空值。

我正在使用 mongod --version
数据库版本 v2.6.11

npm -v mongoose
2.14.4

最佳答案

来自documentation稀疏复合索引上:

Sparse compound indexes that only contain ascending/descending index keys will index a document as long as the document contains at least one of the keys.

在您的情况下,这意味着只有当文档中缺少复合索引的所有三个组件时,文档才会从索引中排除,从而免除唯一约束。

所以您尝试添加的稀疏索引将允许多个文档没有三个键中的任何,但对于所有其他情况,所有三个字段的组合必须是唯一的,任何缺失字段的值为 null

在您的示例文档中,从唯一索引的角度来看,它们都如下所示:

{
"_type" : "veridianDynamics",
"model" : "sierra",
"model_unique : null
}

因此,不是唯一的。

仅供引用,如果您的复合稀疏索引中存在地理空间或文本索引,则此规则有异常(exception)情况,更改规则以在确定是否将文档包含在索引中时仅考虑该特殊索引字段。

关于mongodb - Mongo 稀疏索引未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33608985/

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