MongoDB中的数组唯一索引

时间:2014-09-04 05:55:09

标签: mongodb indexing

假设我们有类似的文档集合:

{
  foo: "Bar",
  foos: [1, 2, 3]
}

我想定义一个唯一索引,以便不能将与此文档相同的文档插入到数据库中。

db.stuffs.ensureIndex({ foos: 1 }, { unique: true })

似乎阻止包含带有任何交集的foos数组的任何文档,例如。如果上面的文档已经在数据库中,那么

{
    foo: "Bar",
    foos: [ 1 ]
}

也会被阻止。

> db.stuffs.ensureIndex({ foos: 1 }, { unique: true })
> db.stuffs.insert({ foo: "Bar", foos: [ 1, 2, 3 ]})
> db.stuffs.insert({ foo: "Bar", foos: [ 1 ]})
E11000 duplicate key error index: test.stuffs.$foos_1  dup key: { : 1.0 }

我希望能够插入[1,2],[2,1],[1,3]等,但不能插入[1,2]

3 个答案:

答案 0 :(得分:1)

数组索引不符合您的要求。但我认为您可以切换到另一种格式来存储您的数据。

如果不需要使用数组的功能(例如$ addToSet,$ push op),您可以简单地将数据散列/映射到另一种格式。例如:[1,2,3]到字符串“1,2,3”。

虽然我假设您希望保留阵列操作以进行一些更新。然后你可以尝试下面的子文档:

db.stuffs.ensureIndex({ foos: 1 }, { unique: true })  // build the index for the sub doc
db.stuffs.insert({ foo: "Bar", foos: {k:[ 1, 2, 3 ]}})
db.stuffs.insert({ foo: "Bar", foos: {k:[ 1 ]}})
db.stuffs.update({ "_id" : ObjectId("54081f544ea4d4e96bffd9ad")}, {$push:{"foos.k": 2}})
db.stuffs.insert({ foo: "Bar", foos: {k:[1, 2]}})
E11000 duplicate key error index: test.stuffs.$foos_1  dup key: { : { k: [ 1.0, 2.0 ] } }

答案 1 :(得分:0)

请参阅这个问题。解释为什么唯一索引在这种情况下不会起作用。

Unique index in MongoDB

  

要索引包含数组值的字段,MongoDB会创建一个索引   数组中每个元素的键。

答案 2 :(得分:0)

如果您要索引的数组大小不变,您可以创建一个唯一的多键索引,如下所示:

collection.createIndex({"coordinate.0": 1, "coordinate.1": 1}, {unique: true})

coordinate 是一个大小为 2 的数组。

当我尝试插入重复坐标时,它按预期返回错误。