Arrays MongoDB中的唯一索引
有人能帮我在以下情况下创建唯一索引@mongoDB吗 假设我有一个这样的模式,我希望在1.path 2.3.switches.name“4.switches.value”上有一个唯一的复合索引 所以如果我尝试插入Arrays MongoDB中的唯一索引,arrays,json,mongodb,mongodb-query,Arrays,Json,Mongodb,Mongodb Query,有人能帮我在以下情况下创建唯一索引@mongoDB吗 假设我有一个这样的模式,我希望在1.path 2.3.switches.name“4.switches.value”上有一个唯一的复合索引 所以如果我尝试插入 { "path": "somepath", "verb": "GET", "switches": [ { "name": "id", "value":"123" }, { "name": "age",
{
"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"
}
]
}
或
我不应该有任何错误
基本上,我应该被允许插入带有不同数组“开关”的文档。恐怕您想要实现的目标无法通过您当前的模式实现 首先,您必须了解索引上的数组是如何工作的: 要为包含数组值的字段编制索引,MongoDB为数组中的每个元素创建索引键 这表明数组不是作为单个对象编制索引,而是无意中编入多个对象 <>为了实现类似的结果,您可以考虑使用对象属性映射代替:
{
"path" : "somepath",
"verb" : "GET",
"switches" : {
"id": "123",
"age": "25"
}
}
并像往常一样创建唯一索引:
db.yourCollection.createIndex({"path": 1, "verb": 1, "switches": 1}, {"unique": true});
然而,这通常是不可取的,因为查询密钥是非常重要的因此,您也可以将数组包装到另一个对象中:
{
"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});
如果您计划在开关.options
数组上执行查询,这将是更理想的解决方案
yourDatabase.yourCollection.ensureIndex({"path": 1, "verb": 1, "switches": 1}, {"unique": true})
您可以根据需要使用ensureCollection()
或createCollection
。
但如果选项下的元素顺序发生变化,“选项”:[{“名称”:“年龄”,“值”:“25”},{“名称”:“id”,“值”:“123”}则此操作失败不会出现重复错误。MongoDB嵌入式文档索引的工作方式与嵌入式文档查询类似,这意味着它们必须精确匹配字段顺序。再加上多键索引是如何工作的,如果不能保证字段顺序,那么单靠MongoDB本身似乎不可能保证唯一性。
db.yourCollection.createIndex({"path": 1, "verb": 1, "switches": 1}, {"unique": true});
yourDatabase.yourCollection.ensureIndex({"path": 1, "verb": 1, "switches": 1}, {"unique": true})