Mongodb对两个字段组合的明显计数

时间:2017-11-15 07:38:23

标签: mongodb

在我的一个项目中,我需要对数据库集合中两个字段的组合进行明确计数。我将在下面简要介绍一下我收藏的结构。

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

/************* 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”)

Room 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

1 个答案:

答案 0 :(得分:0)

您可以使用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字段中选择不同的值,此查询的响应将是包含字段_id(用户ID)和rooms(此用户发布的ObjectId个房间数组)的文档。