【问题标题】:How to get common things between two users in mongodb如何在mongodb中获取两个用户之间的共同点
【发布时间】:2015-09-07 06:42:16
【问题描述】:

我需要计算两个用户的共同点赞项目。我如何在 Spring Data MongoDB 中做到这一点。

假设user1喜欢物品a,user2喜欢物品a,那么这些用户之间的共同物品是1。那么,这里的物品喜欢/不喜欢的结构相同,那么如何通过mongodb查询得到这个物品。

我的域名设计看起来像

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

}

【问题讨论】:

  • 这并没有真正解释很多。 itemId 是否对每个用户都是唯一的,以便每个 userId 不会多次列出它?是否为所有用户保留相同的 itemId 值?是否可以识别两个用户在itemId 上共享相同的“喜欢”状态?
  • 是的,我已经更新了问题,请查看。

标签: java mongodb mongodb-query aggregation-framework spring-data-mongodb


【解决方案1】:

您基本上希望这个聚合管道带有.aggregate() 方法。简而言之,您为普通用户提供匹配并要求具有“喜欢”状态的项目。然后您“按”“itemId”“分组”并计算两个用户之间的匹配数。最后,您将其过滤到所有“具有”计数“大于”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))

    );

它提供了使用.aggregate() 对您选择的类或集合运行的管道。

【讨论】:

  • 我可以使用 $lookup 吗,它为我提供了 item_id 和 count 。我想使用 item_id 从另一个集合“项目”中获取数据。一种方法是我可以使用第二个查询,但如果可以的话,那就太好了。
  • @PrabjotSingh Ask a new Question。这就是它在这里的工作方式。我们回答您提出的问题,然后就完成了。当你有一个新问题要问(像那样)时,你会发布一个新问题。还要了解$lookup 本质上是在运行另一个查询,尽管是在服务器上,这将增加大量成本。因此,SQL 中经常滥用的那种“自连接”模式通常会被避免,并且“应该”通过更好的设计来避免。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多