【问题标题】:How can i optimize my schema to remove useless default index on "_id"如何优化我的架构以删除“_id”上无用的默认索引
【发布时间】:2018-04-16 20:50:34
【问题描述】:

这是我的文档结构:

db.like
{
  _id: objectid, /* not null */ 
  id_from: int64, /* not null */
  id_to: int64, /* not null */
  date: datetime, /* default NOW not null */
}

db.like.createIndex( {"id_to": 1, "id_from": 1}, {unique: true} );  
db.like.createIndex( {"id_to": 1, "date": -1}, {unique: false} );  

仅通过以下方式之一加载文档:

db.like.find({$and: [{id_to:xxx}, {id_from:yyyy}]})

db.like.find({id_to:xxx}).sort({date:-1});

后来我像这样对集合进行分片:

sh.shardCollection( "like", {"id_to": 1, "id_from": 1}, unique: true );

如您所见,我根本不使用"_id" 上的索引。我有点担心"_id" 上的索引会无用。他们是优化我的架构的一种方式,还是更好地保持这种方式?


注意:该解决方案必须与 sharding 一起使用,因此 clcto seam 给出的解决方案对此不利!它的解决方案是将 _id 声明为如下文档:

{
   _id : { 
      to : int64,
      from : int64
   },
   date : datetime
}

但我很确定像这样的声明查询

db.like.find({id_to:xxx}).sort({date:-1});

将在所有分片上完成

【问题讨论】:

  • Mongo 的设计使得每个文档都需要有一个唯一的 id,这是由_id 上的唯一索引来保证的。 AFAIK,您无法删除它,但您可以设置您的文档,以便 _id 是包含 id_toid_from 的文档,因为提供的代码保证是唯一的。
  • @clcto :谢谢,但是如何将 _id 设置为包含 id_to 和 id_from 的文档,同时保持我的 2 个查询性能?

标签: mongodb mongodb-query mongodb-indexes


【解决方案1】:

Mongo 的设计使得每个文档都需要有一个唯一的 id,这是由_id 上的唯一索引来确保的。 AFAIK,您无法删除它,但如果您能够更改架构,则可以设置您的文档,以便 _id 是包含 id_toid_from 的文档,因为提供的代码保证是唯一的:

{
   _id : { 
      to : int64,
      from : int64
   },
   date : datetime
}

对于索引,由于 id 索引已经创建,所以你不需要那个。您可以将第二个索引到_id 文档中:

db.like.createIndex( {"_id.to": 1, "date": -1}, {unique: false} );  

那么您的查询将是:

db.like.find({ _id : { to: xxx, from: yyyy } });
db.like.find({ _id.to: xxx }).sort({date:-1});

注意: MongoDB 要求_id 是不可变的,所以如果您需要能够更新原始字段id_toid_from,则不能使用此方法。

【讨论】:

  • hmm 很有趣,那么分片呢?我将在 sh.shardCollection("like", {"_id.to": 1, "_id.from": 1}, unique: true ); ?或者只是在 sh.shardCollection("like", {"_id": 1}, unique: true );
  • 我不熟悉 mongo 分片,所以无法回答。
  • 他们是否有任何关于将文档用作 _id 的文档?这种方法有什么缺点吗?
  • 我知道的唯一缺点是_id 字段是不可变的。所以如果以后这些字段需要更新,这个方法就不能用了。
  • 来自docs.mongodb.com/manual/core/document/index.html: "文档对字段名有如下限制:字段名_id保留作为主键使用;其值在集合中必须唯一,不可变, 并且可以是数组以外的任何类型。”
猜你喜欢
  • 2016-03-03
  • 1970-01-01
  • 2012-07-23
  • 2018-10-02
  • 2023-03-06
  • 2017-07-25
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
相关资源
最近更新 更多