自定义MongoDB对象_id与复合索引

时间:2016-08-09 10:03:00

标签: mongodb indexing compound-index nosql

所以我需要在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索引是否是一个好习惯,因为它们可能不是完全随机的。你觉得怎么样?

提前致谢。

更新

我的数据库已经有很多占用内存的索引,所以我想保持索引大小尽可能低,特别是对于仅用于验证唯一性的集合。

2 个答案:

答案 0 :(得分:2)

我建议解决方案1,即使用复合索引并使用两个不同的属性key1和key2

db.yourCollection.ensureIndex( { "key1": 1, "key2": 1 }, { unique: true } )
  1. 如果需要,您可以根据个别字段轻松搜索。即如果您只需要通过key1或key2进行搜索,那么复合索引就很容易了。如果您使用密钥组合_id,则很难按单个字段进行搜索。
  2. Mongo中的文档大小在设计文档时非常困扰。
  3. 如果在不久的将来,如果您需要相对于其他值更改同一文档的键值,则很容易。如果您在其他集合的文档中使用此文档的引用,请记住。
  4. 就可扩展性而言,_id索引将是顺序的,易于修改,您可以让MongoDB管理它。
  5. 如果您正在使用这些键进行搜索,那么它将使用该索引,否则它将使用其他必需的索引进行搜索。
  6. 如果您仍在考虑文档大小而非,那么您可以使用解决方案1,使_id像

    一样
    {_id:{key1:<value1>,key2:<value2>}}
    

    通过这个你也可以搜索特定的_id.key1。

    <强>更新

    是的,如果您关注的是文档大小而不是维护。如果您确定密钥将来不会修改同一文档,并且如果它仍然在修改并且没有其他集合中的引用,那么您可以使用解决方案1.只需使用密钥作为对象而不是下划线_。如果以后需要,您也可以稍后添加更多密钥。

答案 1 :(得分:1)

我认为解决方案2更适合您的要求。绝对可以生成MongoDB的_id值。大多数应用程序确实使用UUID填充_id值。在您的情况下,为_id值连接值1和2是有意义的,假设此集合主要用于验证唯一性(即临时表的类型)或查找目的。

解决方案1 ​​价格昂贵,因为它需要额外的索引。同样,这取决于您是否打算单独使用此集合来验证唯一性目的,还是用于其他一些用例。

请注意,您需要创建唯一的复合索引,以便它不允许为重复值插入数据。