假设我们有类似的文档集合:
{
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]
答案 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)
答案 2 :(得分:0)
如果您要索引的数组大小不变,您可以创建一个唯一的多键索引,如下所示:
collection.createIndex({"coordinate.0": 1, "coordinate.1": 1}, {unique: true})
coordinate
是一个大小为 2 的数组。
当我尝试插入重复坐标时,它按预期返回错误。