让我们说我有一个集合,其对象具有这样的结构:
{
"a": [
{"name": "foo", "meh": "whatever"},
{"name": "bar", "meh": "hem"}
],
"other_stuff": { }
}
此集合中的对象可能不具有“ a”字段。我想对数据库强制执行约束,以便 if 对象具有“ a”字段,该“ a”字段中包含的对象中的“ name”字段均不重复在整个收藏集中。
例如,如果上面的对象已经在集合中,则以下对象将被标记为违反约束条件:
{
"a": [
{"name": "bar", "meh": "meh meh"}
],
"other_stuff": { }
}
此外,无论集合中是否已有其他文档,以下对象都将被标记为约束违例:
{
"a": [
{"name": "boo", "meh": "blub"},
{"name": "boo", "meh": "glub"}
],
"other_stuff": { }
}
是否可以为MongoDB指定局部唯一索引?如果Mongo 3.2、3.4、3.6和4.0之间有所不同,也很高兴知道这一点-我不在乎3.2之前的版本。
我当时想是为了防止在文档之间重复(可能是由于被动阅读器的Javscript [] > '' === false
和undefined > '' === false
和['anything'] > '' === true
),
db.MyCollection.createIndex(
{ "a.name": 1 },
{
"unique": true,
"partialFilterExpression": {
"a": { "$gt": '' }
}
}
)
...并且我认为防止文档中重复值的唯一方法是在应用程序逻辑中在对“ a”字段进行操作时强制使用$addToSet
运算符
无论哪种情况,我都很高兴得到纠正或证实。