2015-02-05 28 views
1

我正在尝试使用多键索引来查找另一个键的最新记录。我似乎无法完成它。使用多键索引mongo max/min - 查找给定密钥的最新记录

在伪SQL我要说

create table my_table (user_id int, post_time timestamp, content text); 
create index my_index (user_id,post_time) on my_table; 

我可以再然后点击索引查找最新post_time为每个用户

select user_id,max(post_time) from my_table group by user_id 

所有漂亮的,甚至快了许多百万的记录,数据将来自索引,我们根本不打中。

随着蒙戈

db.my_table.ensureIndex({ user_id:1,post_time:1}) 

和查询

db.my_table.aggregate({ $group:{ '_id':'$user_id', 'max':{ $max:'$post_time'} }) 

但这并不击中指数 - 它似乎做了(慢)表扫描。

{ 
    "stages" : [ 
     { 
      "$cursor" : { 
       "query" : { 

       }, 
       "fields" : { 
        "post_time" : 1, 
        "user_id" : 1, 
        "_id" : 0 
       }, 
       "plan" : { 
        "cursor" : "BasicCursor", 
        "isMultiKey" : false, 
        "scanAndOrder" : false, 
        "allPlans" : [ 
         { 
          "cursor" : "BasicCursor", 
          "isMultiKey" : false, 
          "scanAndOrder" : false 
         } 
        ] 
       } 
      } 
     }, 
     { 
      "$group" : { 
       "_id" : "$user_id", 
       "max" : { 
        "$max" : "$post_time" 
       } 
      } 
     } 
    ], 
    "ok" : 1 
} 

我需要在这里做什么来使这个查询执行?有没有更好的方法/数据结构我应该用mongo?

回答

1

不幸的是,您创建的任何索引都无法覆盖您的aggregate查询。只有

,当他们出现在管道的开始$match$sort$geoNear阶段可以使用索引。

docs

当他们出现在管道开头的$match$sort管道运营商可以采取指数 的优势。版本2.4中的新功能: $geoNear管道运营商利用地理空间索引。 使用$geoNear时,$geoNear流水线操作必须显示为 聚合流水线中的第一个阶段。 即使流水线 使用索引,汇总仍需要访问实际的 文档;即索引不能完全覆盖聚合管道。

+0

谢谢你的信息。任何建议如何使这种查询执行使用mongo? – 2015-02-12 07:15:28