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

标签 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”)

房间 1 有 2 名活跃成员 ObjectId(“59a7a7c462e1e20c15000001”)和ObjectId(“59a7a7c462e1e20c15000002”)

Room 2 有 3 位活跃成员 ObjectId(“59a7a7c462e1e20c15000001”),ObjectId(“59a7a7c462e1e20c15000002”)和ObjectId(“59a7a7c462e1e20c15000003”)

我需要像用户参与的房间有多少这样的结果因此对于上面的示例我需要如下结果

  1. 用户 1 ObjectId("59a7a7c462e1e20c15000001"):计数 2
  2. 用户 2 ObjectId("59a7a7c462e1e20c15000002"):计数 2
  3. 用户 3 ObjectId("59a7a7c462e1e20c15000003"):计数 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 字段中选择不同的值,此查询的响应将是包含字段 _id(用户 ID)和 rooms(ObjectId 数组)的文档数组该用户已发帖的房间数)。

关于Mongodb 两个字段组合的不同计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47301829/

相关文章:

mongodb - Mongodb DBRefs 有什么问题?

mongodb - 用于空间搜索的 neo4j 与 mongodb

java - spring boot 中用于保存 createdDate、lastModifiedDate、createdBy、lastModifiedBy 的 mongodb 审计

mongodb - MongoDB 3.0 中的“无法取消链接套接字文件”错误

mongodb - 使用 MongoDB 查询在字符串中搜索多个单词/子字符串?

javascript - 如何在 JavaScript 中将 Decimal128 值转换为数字?

java - MongoDB 数据模型支持每个事件、每个日期范围的唯一访问者

mongodb - 来自Dockerfile RUN步骤的数据不在镜像中

ruby-on-rails - Solr Sunspot - 重新索引对象不会自动运行

MongoDB - 从单个数组元素中取消设置属性