Arrays MongoDB中的唯一索引

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",

有人能帮我在以下情况下创建唯一索引@mongoDB吗

假设我有一个这样的模式,我希望在1.path 2.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":"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})