两个字段组合的Mongodb不同计数

两个字段组合的Mongodb不同计数,mongodb,Mongodb,在我的一个项目中,我需要为数据库集合中的两个字段的组合获取一个不同的计数。我将在下面简要介绍我的收藏结构 它基本上是一个讨论系统,它有一个房间列表,人们可以在其中发送信息。我给出了一个需要计数的测试数据 /************* First Chat **********************************/ { "_id" : ObjectId("8a1370e00d5b6e0a2a865c01"), "users" : ObjectId("

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

它基本上是一个讨论系统,它有一个房间列表,人们可以在其中发送信息。我给出了一个需要计数的测试数据

/************* 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"
}
它有两个房间 目标59EF16244B964729B3154A11和目标59EF16244B964729B3154A12

房间1有2名活动成员 目标59A7C462E1E20C15000001和目标59A7A7C462E1E20C15000002

房间2有3个活跃成员 目标59A7C462E10C15000001、目标59A7C462E1E20C15000002和目标59A7C462E10C15000003

我需要的结果,如如何可能房间一个用户参与,所以对于上面的例子,我需要的结果如下

用户1对象59A7A7C462E1E20C1500001:计数2 用户2对象59A7C462E1E20C15000002:计数2 用户3对象59A7A7C462E1E20C1500003:计数1 您可以使用db.collection.distinct并将查询指定为第二个参数:

db.getCollection('message').distinct('rooms', { users: ObjectId('your-user-id')})
如果需要为每个用户获取此信息,可以使用聚合:

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

在这里,我们按用户字段对文档进行分组,并使用$addToSet从$rooms字段中选择不同的值,此查询的响应将是带有字段_id的文档数组,该字段是用户的id,而rooms是该用户发布的房间的ObjectId数组。

db.collection.aggregate[{$group:{\u id:{user:$user,room:$room}},{$group:{{{{u id:${u id.user,count:{$sum:1}}]因此,获得不同的组合,然后仅按用户分组,以计算不同的房间。完美的解决方案!感谢您上述查询将仅针对特定用户,我是否有可能获得所有用户和按用户分组的结果?太棒了!很有效