MongoDB中数组的唯一索引

MongoDB中数组的唯一索引,mongodb,indexing,Mongodb,Indexing,假设我们有一个与此类似的文档集合: { foo: "Bar", foos: [1, 2, 3] } 我想定义一个唯一的索引,这样就不能将与此索引相同的文档插入到数据库中 db.stuffs.ensureIndex({ foos: 1 }, { unique: true }) 似乎阻止了任何包含foos数组且具有任何交集的文档,例如,如果上面的文档已经在数据库中,则 { foo: "Bar", foos: [ 1 ] } 也会被封锁 > db.stuffs.en

假设我们有一个与此类似的文档集合:

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

数组索引将无法满足您的要求。但是我认为你可以切换到另一种格式来存储你的数据

如果不需要使用array的特性(例如$addToSet、$push op),您可以简单地将数据散列/映射到另一种格式。e、 g.:[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 ] } }

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

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


在这里,解释用例有点抽象。但是,通常使用
$addToSet
将数组包含在单个文档中,或者使用单独的文档而不使用数组。你最好解释一下你真正的用例,以得到任何有用的答案。索引不会为您这样做。