MongoDB 选择 * 分组依据

Posted

技术标签:

【中文标题】MongoDB 选择 * 分组依据【英文标题】:MongoDB SELECT * GROUP BY 【发布时间】:2020-09-28 08:36:12 【问题描述】:

我正在玩 MongoDB,试图弄清楚如何做一个简单的

SELECT * FROM data GROUP BY userid

但我不知道怎么做?我有一个像

这样的集合
data=[
    _id: "Kcs93S4R9v",
    userid: "KqDuEwgv",
    time: 1584353953159,
    content: 
, 
    _id: "3d0c4375",
    userid: "LqDuEwgv",
    time: 1584353953159,
    content: 
, 
    _id: "574ee87",
    userid: "LqDuEwgv",
    time: 1584353953159,
    content: 
, 
    _id: "Pcs93S4R9v",
    userid: "KqDuEwgv",
    time: 1584353953159,
    content: 
]

我希望输出是这样的

[
    _id: "Kcs93S4R9v",
    userid: "KqDuEwgv",
    time: 1584353953159,
    content: [, ]
, 
        _id: "574ee87",
        userid: "LqDuEwgv",
        time: 1584353953159,
        content: [, ]
]

但我似乎无法弄清楚。有没有办法用 MongoDB 做到这一点?

【问题讨论】:

【参考方案1】:

您需要在聚合中使用$group 运算符。如下:

db.collection.aggregate([
  
    $group: 
      _id: "$userid",
      time: 
        $first: "$time"
      ,
      content: 
        $push: "$content"
      
    
  
])

MongoPlayGroundLink

编辑: 要首先将文档与time 字段匹配,可以使用$match 运算符,

db.collection.aggregate([
  
    $match: 
      time: 1584353953159
    
  ,
  
    $group: 
      _id: "$userid",
      time: 
        $first: "$time"
      ,
      content: 
        $push: "$content"
      
    
  
])

【讨论】:

如果我必须根据时间进行此查询该怎么办,例如在特定时间戳中查找用户? 你的意思是找到特定时间的用户,然后像上面那样对他们进行分组? 是的,这是必需的。 我已经更新了我的答案,你需要使用$match运营商。

以上是关于MongoDB 选择 * 分组依据的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB(课时28 group操作)

如何在 MongoDB 中进行分组选择

在同一个mongodb查询中选择按计数和不同计数分组

mongodb 分组统计: 按deviceId、tenant分组,统计总记录条数、求和workload

mongodb分组函数的使用(spring-data-mongodb)

C# 操作mongodb 分组