MongoDB中的唯一索引

4

请问有人能帮我在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"
    }
  ]
}

我不应该得到任何错误。

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

2个回答

4
我担心您目前的模式无法实现您想要的结果。
首先,您需要了解索引中数组的工作原理: https://docs.mongodb.com/manual/core/index-multikey/#multikey-indexes 引用如下:

为了索引一个包含数组值的字段,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});

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

但是如果选项下的元素顺序发生变化,这种方法就会失败,"options": [ { "name" : "age", "value" : "25" }, { "name" : "id", "value" : "123" } ]不会产生重复错误。 - Abhijeet Ahuja
MongoDB嵌入式文档索引的工作方式类似于嵌入式文档查询,这意味着它们必须完全匹配且字段顺序很重要。考虑到多键索引的工作原理,如果无法保证字段顺序,则似乎不可能仅使用MongoDB本身保证唯一性。 - kazenorin

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接