gpt4 book ai didi

arrays - MongoDB 中的唯一索引

转载 作者:可可西里 更新时间:2023-11-01 09:34:57 28 4
gpt4 key购买 nike

有人可以帮我为以下条件创建唯一索引@mongoDB 吗?

假设我有一个这样的模式,我想要一个唯一的复合索引 1.path 2.verb 3."switches.name"4."switches.value"

{
"path": "somepath",
"verb": "GET",
"switches": [
{
"name": "id",
"value":"123"
},
{
"name": "age",
"value":"25"
}
]
}

所以如果我尝试插入

{
"path": "somepath",
"verb": "GET",
"switches": [
{
"name": "id",
"value":"123"
},
{
"name": "age",
"value":"25"
}
]
}

我应该得到重复的错误,但是如果我插入

{
"path": "somepath",
"verb": "GET",
"switches": [
{
"name": "id",
"value":"123"
},
{
"name": "age",
"value":"24"
}
]
}

{
"path": "somepath",
"verb": "GET",
"switches": [
{
"name": "id",
"value":"123"
},
{
"name": "age",
"value":"25"
},
{
"name": "foo",
"value":"bar"
}
]
}

我不应该得到任何错误。

基本上,我应该被允许插入具有不同数组“开关”的文档。

最佳答案

恐怕您想要实现的目标无法通过您当前的模式实现。

首先你必须了解索引上的数组是如何工作的: https://docs.mongodb.com/manual/core/index-multikey/#multikey-indexes

To index a field that holds an array value, MongoDB creates an index key for each element in the array.

这表明数组未作为单个对象进行索引,而是展开为多个对象。

要获得与您想要的类似的结果,您可以考虑改用对象属性映射:

{
"path" : "somepath",
"verb" : "GET",
"switches" : {
"id": "123",
"age": "25"
}
}

并像往常一样创建唯一索引:

db.yourCollection.createIndex({"path": 1, "verb": 1, "switches": 1}, {"unique": true});

但是,这通常是不可取的,因为查询 key 很重要
(Also read about this here) .

因此,您也可以将数组包装在另一个对象中:

{
"path" : "somepath",
"verb" : "GET",
"switches" : {
"options": [
{
"name" : "id",
"value" : "123"
},
{
"name" : "age",
"value" : "25"
}
]
}
}

具有相同的索引:

db.yourCollection.createIndex({"path": 1, "verb": 1, "switches": 1}, {"unique": true});

如果您计划在 switches.options 数组上执行查询,这将是更理想的解决方案。

关于arrays - MongoDB 中的唯一索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38044677/

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