如何在 mongodb 中获取两个用户之间的共同点

How to get common things between two users in mongodb

我需要计算两个用户共同喜欢的项目。我如何在 spring 数据 mongodb.

中执行此操作

假设user1喜欢item a,user2喜欢item a,那么这些用户之间的common item是1。所以,item的结构相同like/dislike这里,那么如何通过mongodb得到这个item查询。

我的域设计看起来像

public class UserItemHistory {

    long userId;
    long itemId;
    int status   // status will be 1 if user likes item

}

数据结构将是

{
   user_id:1,
   item_id:2,
   status:1

}

{
   user_id:2,
   item_id:2,
   status:1

}

您基本上想要使用 .aggregate() 方法的聚合管道。简而言之,您为普通用户提供匹配和请求具有 "liked" 状态的项目。然后你 "group by" "itemId" 并计算两个用户之间的匹配次数。最后,您将其过滤到所有项目 "having",计数为 "greater than" 1,因为这表示两个用户都存在相同的项目。

作为聚合管道,只需三个简单步骤,$match 然后 $group 计数然后 $match 再次计算计数值:

  { "$match": {
    "userId": { "$in": [1,2] },
    "status": 1
  }},
  { "$group": {
    "_id": "$itemId",
    "count": { "$sum": 1 }
  }},
  { "$match": { "count": { "$gt": 1 } } }

在spring mongo下可以用helpers写成这样:

    Aggregation aggregation = newAggregation(
            match(
                    Criteria.where("userId").in(Arrays.asList(1, 2))
                            .and("status").is(1)
            ),

            group("itemId").count().as("count"),

            match(Criteria.where("count").gt(1))

    );

根据您选择的 class 或集合提供 运行 和 .aggregate() 的管道。