如何优化我的架构以删除“_id”上无用的默认索引

时间:2018-04-16 20:50:35

标签: mongodb mongodb-query mongodb-indexes

这是我的文档结构:

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"上的索引是无用的。他们是一种优化我的架构的方法,还是更好地保留它?

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

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

但我很确定使用像

这样的声明查询
db.like.find({id_to:xxx}).sort({date:-1});

将在所有分片上完成

1 个答案:

答案 0 :(得分: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,则不能使用这种方法。