有人可以帮我创建以下条件的唯一索引@ mongoDB吗?
假设我有这样的架构,我想在1.path 2.verb上有一个唯一的复合索引3.“switches.name”4。“switches.value”
ToList
所以,如果我尝试插入
Dim pointPairs = Enumerable.Range(0, points.Length - 2).
Select(Function(n) Tuple.Create(points(n), points(n + 1))).
ToArray()
我应该会出现重复错误,但如果我插入
{
"path": "somepath",
"verb": "GET",
"switches": [
{
"name": "id",
"value":"123"
},
{
"name": "age",
"value":"25"
}
]
}
或
{
"path": "somepath",
"verb": "GET",
"switches": [
{
"name": "id",
"value":"123"
},
{
"name": "age",
"value":"25"
}
]
}
我不应该有任何错误。
基本上,我应该被允许插入具有不同数组“开关”的文档。
答案 0 :(得分:3)
我担心你想要实现的目标不能通过你当前的架构。
首先,您必须了解索引上的数组如何工作: https://docs.mongodb.com/manual/core/index-multikey/#multikey-indexes
要索引包含数组值的字段, MongoDB会为数组中的每个元素创建索引键。
这表明数组不会被索引为单个对象,而是 unwinded 成多个对象。
要获得与您想要的类似的结果,您可以考虑使用对象属性贴图:
{
"path" : "somepath",
"verb" : "GET",
"switches" : {
"id": "123",
"age": "25"
}
}
并像往常一样创建唯一索引:
db.yourCollection.createIndex({"path": 1, "verb": 1, "switches": 1}, {"unique": true});
然而,这通常是不受欢迎的,因为查询密钥非常重要 (Also read about this here)
因此,您可以将数组包装在另一个对象中:
{
"path" : "somepath",
"verb" : "GET",
"switches" : {
"options": [
{
"name" : "id",
"value" : "123"
},
{
"name" : "age",
"value" : "25"
}
]
}
}
使用相同的索引:
db.yourCollection.createIndex({"path": 1, "verb": 1, "switches": 1}, {"unique": true});
如果您打算在switches.options
阵列上执行查询,这将是更理想的解决方案。
答案 1 :(得分:0)
yourDatabase.yourCollection.ensureIndex({"path": 1, "verb": 1, "switches": 1}, {"unique": true})
您可以根据需要使用ensureCollection()
或createCollection
。
https://docs.mongodb.com/manual/core/index-unique/