这是我的文档结构:
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});
将在所有分片上完成
答案 0 :(得分:1)
Mongo的设计使得每个文档都需要具有唯一ID,这由_id
上的唯一索引确保。 AFAIK,您无法删除它,但如果您能够更改架构,则可以设置文档,以便_id
是包含id_to
和id_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_to
和id_from
,则不能使用这种方法。