我需要一个索引,该索引将为我提供所有字段之间该字段的唯一性。例如,我有文档:
{
_id: ObjectId("123"),
fieldA: "a",
fieldB: "b"
}
并且我想禁止插入文档
{
_id: ObjectId("456"),
fieldA: "new value for field a",
fieldB: "a"
}
因为已经存在在字段“ fieldA”上设置了值“ a”的文档。可能吗?
答案 0 :(得分:0)
似乎您需要一个multikey index和一个unique constraint。 考虑到每个集合中只能有一个多键索引,因此,您必须在数组中包含所有要唯一的字段
{
_id: ObjectId("123"),
multikey: [
{fieldA: "a"},
{fieldB: "b"}
]
}
尝试使用此代码
db.collection.createIndex( { "multikey": 1}, { unique: true } )
要查询,您必须编码
db.collection.findOne({"multikey.fieldA": "a"}, // Query
{"multikey.fieldA": 1, "multikey.fieldB": 1}) // Projection
有关更多信息,请查看embedded multikey文档。
希望这会有所帮助。
另一个选择是用每个唯一关键字创建一个文档,并用该唯一关键字索引,并在每个候选文档的字段上执行循环,如果找到任何关键字,则取消写操作。 IMO此解决方案消耗的资源更多,通过更改,您可以获取书面文档中消耗的所有密钥的列表。
db.collection.createIndex( { "unikey": 1}, { unique: true } )
db.collection.insertMany( {[{"unikey": "$FieldA"},{"unikey": "$FieldB"}]}
db.collection.find({"unikey": 1})