【问题标题】:Mongodb distinct count for combination of two fields [duplicate]两个字段组合的Mongodb不同计数[重复]
【发布时间】:2017-11-15 07:38:22
【问题描述】:

在我的一个项目中,我需要获取数据库集合中两个字段组合的不同计数。我将在下面简要介绍我的收藏结构。

它基本上是一个讨论系统,它有一个人们发送消息的房间列表。我正在提供一个需要计数的测试数据

/************* First Chat **********************************/
{
    "_id"       : ObjectId("8a1370e00d5b6e0a2a865c01"),
    "users"     : ObjectId("69a7a7c462e1e20c15000001"),
    "rooms"     : ObjectId("89ab16244b964729b3154a11"),
    "message"   : "Hello"
},
{
    "_id"       : ObjectId("8a1370e00d5b6e0a2a865c02"),
    "users"     : ObjectId("69a7a7c462e1e20c15000001"),
    "rooms"     : ObjectId("89ab16244b964729b3154a11"),
    "message"   : "Hello test"
},
{
    "_id"       : ObjectId("8a1370e00d5b6e0a2a865c03"),
    "users"     : ObjectId("69a7a7c462e1e20c15000002"),
    "rooms"     : ObjectId("89ab16244b964729b3154a11"),
    "message"   : "I am here"
},
/************* second Chat **********************************/
{
    "_id"       : ObjectId("8a1370e00d5b6e0a2a865c04"),
    "users"     : ObjectId("69a7a7c462e1e20c15000001"),
    "rooms"     : ObjectId("89ab16244b964729b3154a12"),
    "message"   : "Hello New"
},
{
    "_id"       : ObjectId("8a1370e00d5b6e0a2a865c05"),
    "users"     : ObjectId("69a7a7c462e1e20c15000001"),
    "rooms"     : ObjectId("89ab16244b964729b3154a12"),
    "message"   : "Hello test new"
},
{
    "_id"       : ObjectId("8a1370e00d5b6e0a2a865c06"),
    "users"     : ObjectId("69a7a7c462e1e20c15000002"),
    "rooms"     : ObjectId("89ab16244b964729b3154a12"),
    "message"   : "I am here!!!"
},
{
    "_id"       : ObjectId("8a1370e00d5b6e0a2a865c07"),
    "users"     : ObjectId("69a7a7c462e1e20c15000003"),
    "rooms"     : ObjectId("89ab16244b964729b3154a12"),
    "message"   : "I am 3rd user"
}

它有 2 个房间 ObjectId("59ef16244b964729b3154a11") 和 ObjectId("59ef16244b964729b3154a12")

房间 1 有 2 个活跃成员 ObjectId("59a7a7c462e1e20c15000001") 和 ObjectId("59a7a7c462e1e20c15000002")

房间 2 有 3 名活跃成员 ObjectId("59a7a7c462e1e20c15000001")、ObjectId("59a7a7c462e1e20c15000002")和ObjectId("59a7a7c462e1e20c15000003")

我需要像用户参与的房间数量这样的结果所以对于上面的示例,我需要如下结果

  1. 用户 1 ObjectId("59a7a7c462e1e20c15000001") : count 2
  2. 用户 2 ObjectId("59a7a7c462e1e20c15000002") : count 2
  3. 用户 3 ObjectId("59a7a7c462e1e20c15000003") : count 1

【问题讨论】:

  • db.collection.aggregate([{ "$group": { "_id": { "user": "$user", "room": "$room" } }},{ "$group": { "_id": "$_id.user", "count": { "$sum": 1 } } }]) 所以得到不同的组合,然后简单地按用户分组,以便计算不同的房间。
  • 完美解决方案!谢谢

标签: mongodb


【解决方案1】:

您可以使用db.collection.distinct() 并将查询指定为第二个参数:

db.getCollection('message').distinct('rooms', { users: ObjectId('your-user-id')})

如果你需要为每个用户获取这个,你可以使用聚合:

db.getCollection('messages').aggregate([
  { $group: { _id: "$users", rooms: { $addToSet: "$rooms" } } }
]);

在这里,我们按users 字段对文档进行分组,我们使用$addToSet$rooms 字段中选择不同的值,此查询的响应将是具有字段@987654327 的文档数组@(用户 ID)和 roomsObjectIds 该用户发布的房间数组)。

【讨论】:

  • 以上查询仅针对特定用户,我是否可以按用户字段获取所有用户和分组
  • 太棒了!它有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
  • 2015-05-15
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 2016-03-08
  • 2013-09-01
相关资源
最近更新 更多