如何在 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()
的管道。
我需要计算两个用户共同喜欢的项目。我如何在 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()
的管道。