MongoDB中数组的唯一索引

3

假设我们有一个类似于这样的文档集合:

{
  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 ]。


这个有点抽象,很难在这里解释使用情况。一般来说,可以使用$addToSet将数组包含在单个文档中,或者使用不带数组的单独文档。如果您能解释真实的用例,那么就能得到更好的答案。索引无法为您完成此操作。 - Neil Lunn
3个回答

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 ] } }

0
如果您要索引的数组大小是恒定的,可以像这样创建一个唯一的多键索引:
collection.createIndex({"coordinate.0": 1, "coordinate.1": 1}, {unique: true})

coordinate 是大小为2的数组。

当我尝试插入重复的坐标时,它会如预期地返回一个错误。


0
请参考这个问题,解释为什么在这种情况下唯一索引无法工作。 MongoDB中的唯一索引 引用:
要对包含数组值的字段进行索引,MongoDB会为数组中的每个元素创建一个索引键。

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