2017-07-28 40 views
0

我有以下SQL(mysql)查询,我想将它转换为MongoDB。它基本上是获得最高1号文件各组:MongoDB - 查询 - 每个组的顶部文档

SELECT A.* 
FROM ads AS A 
INNER JOIN (SELECT id 
      FROM ads 
      WHERE userId = 1 
      GROUP BY ad_code 
      HAVING MAX(ad_timestamp)) AS B ON B.id = A.id 

从我读迄今有几种方法来聚合数据在MongoDB中(在MongoDB aggregation comparison: group(), $group and MapReduce更多信息):

  • 组(在分片集合不工作)
  • 的MapReduce
  • $组

我我试图用MongoDB汇总框架来解决这个问题。到目前为止,我有这样的:

db.ads.aggregate([ 
    { $match: { userId: ObjectId("5976e215769d8a4a4d75c514") } }, 
    { 
     $group: { 
      _id: "$ad_code", 
      latestTimestamp: { $max: "$ad_timestamp" }, 
     } 
    } 
]) 

但这并不返回匹配的文件,只需将广告代码和最大时间戳的_ids,所以我不能用数据来获得整个文件。

这个问题看起来很重要,但它似乎并没有解决我有同样的问题: Query one document per association from MongoDB

感谢

编辑重复标志:这个问题是别人不同,与我链接的问题不同,因为解决方案使用$first操作数查找1匹配,并使用docIds字段检索未汇总的原始文档。这与其他问题接近解决方案的方式不同,部分原因是随着时间的推移MongoDB的发展。

回答

1

它不返回_id因为您没有要求它。 尝试此查询代替:

db.ads.aggregate([ 
    { $match: { userId: ObjectId("5976e215769d8a4a4d75c514") } }, 
    { $sort: {"ad_timestamp": -1}}, 
    { $group: { 
     _id: "$ad_code", 
     latestTimestamp: { $first: "$ad_timestamp" }, 
     docIds: {$first: "$_id"} 
     } 
    } 
]) 

在这里,我们首先排序ad_timestamp并获得第一每组有$first,和同为_id

+0

谢谢谢谢谢谢你,这东西是真的可怕的开始。 – mils

+0

还有一个快速后续问题 - 这是否意味着如果我没有明确使用“latestTimestamp”字段,我不需要声明它?还是需要为$第一个条件?谢谢 – mils

+1

@mils如果你不使用'latestTimestamp',你可以从**'$ group' **阶段删除它,它不会影响结果 – felix