所以我需要在MongoDB中创建一个查找集合来验证唯一性。要求是检查是否重复相同的2个值。在SQL中,我会像这样
SELECT count(id) WHERE key1 = 'value1' AND key2 = 'value2'
如果上述查询返回计数,则表示该组合不是唯一的。我有两个解决方案,但我不确定哪个更具可扩展性。我需要有30M +文档来创建此映射。
解决方法1:
我在key1和key2
上创建了一个带有复合索引的docs集合{
_id: <MongoID>,
key1: <value1>,
key2: <value2>
}
溶液2:
我编写应用程序逻辑,通过连接value1和value2
来创建自定义_id{
_id: <value1>_<value2>
}
就个人而言,我觉得第二个更优化,因为它只有一个索引,而且doc的大小也更小。但我不确定创建自己的_id索引是否是一个好习惯,因为它们可能不是完全随机的。你觉得怎么样?
提前致谢。
更新
我的数据库已经有很多占用内存的索引,所以我想保持索引大小尽可能低,特别是对于仅用于验证唯一性的集合。
答案 0 :(得分:2)
我建议解决方案1,即使用复合索引并使用两个不同的属性key1和key2
db.yourCollection.ensureIndex( { "key1": 1, "key2": 1 }, { unique: true } )
_id
,则很难按单个字段进行搜索。如果您仍在考虑文档大小而非,那么您可以使用解决方案1,使_id像
一样{_id:{key1:<value1>,key2:<value2>}}
通过这个你也可以搜索特定的_id.key1。
<强>更新强>
是的,如果您关注的是文档大小而不是维护。如果您确定密钥将来不会修改同一文档,并且如果它仍然在修改并且没有其他集合中的引用,那么您可以使用解决方案1.只需使用密钥作为对象而不是下划线_
。如果以后需要,您也可以稍后添加更多密钥。
答案 1 :(得分:1)
我认为解决方案2更适合您的要求。绝对可以生成MongoDB的_id值。大多数应用程序确实使用UUID填充_id值。在您的情况下,为_id值连接值1和2是有意义的,假设此集合主要用于验证唯一性(即临时表的类型)或查找目的。
解决方案1 价格昂贵,因为它需要额外的索引。同样,这取决于您是否打算单独使用此集合来验证唯一性目的,还是用于其他一些用例。
请注意,您需要创建唯一的复合索引,以便它不允许为重复值插入数据。