【问题标题】:Unique index in MongoDBMongoDB中的唯一索引
【发布时间】:2016-10-28 22:04:21
【问题描述】:

有人可以帮我为以下条件创建唯一索引@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"
    }
  ]
}

我不应该得到任何错误。

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

【问题讨论】:

    标签: arrays json mongodb mongodb-query


    【解决方案1】:
    yourDatabase.yourCollection.ensureIndex({"path": 1, "verb": 1, "switches": 1}, {"unique": true})
    

    您可以随意使用ensureCollection()createCollectionhttps://docs.mongodb.com/manual/core/index-unique/

    【讨论】:

      【解决方案2】:

      恐怕您想要达到的目标无法通过您当前的架构实现。

      首先,您必须了解索引数组的工作原理: 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});
      

      但是,这通常是不可取的,因为查询密钥并不简单
      (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 数组执行查询,这将是更理想的解决方案。

      【讨论】:

      • 但是如果选项下元素的顺序发生变化,这将失败,“选项”:[{“名称”:“年龄”,“价值”:“25”},{“名称”:“id ", "value" : "123" } ] 不会给出重复错误。
      • MongoDB 嵌入式文档索引的工作方式类似于嵌入式文档查询,这意味着它们必须完全匹配并且字段顺序很重要。加上多键索引如何工作的事实,如果不能保证字段顺序,似乎无法单独保证 MongoDB 本身的唯一性。
      猜你喜欢
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      相关资源
      最近更新 更多