gpt4 book ai didi

mongodb - 如何编写自连接查询

转载 作者:可可西里 更新时间:2023-11-01 10:02:32 24 4
gpt4 key购买 nike

我有一个简单的集合transactions,其中包含用户和餐厅的信息

{ "user_id" : "U1", "restaurant_id" : "R_1" }
{ "user_id" : "U2", "restaurant_id" : "R_1" }
{ "user_id" : "U1", "restaurant_id" : "R_3" }
{ "user_id" : "U1", "restaurant_id" : "R_4" }
{ "user_id" : "U2", "restaurant_id" : "R_4" }

在这里,我需要找到具有用户 ID U1U2 的用户之间的相关餐厅(即我想找到 U1 和 < strong>U2都去过)

我应该收到这样的输出:-

{ "_id" : "R_4", "users" : [ "U2", "U1" ] }
{ "_id" : "R_1", "users" : [ "U2", "U1" ] }

这意味着用户 U1U2 都访问过餐厅 R_1R_4

我是 mongoDb 的新手,所以在谷歌搜索后我编写了无法正常工作的示例查询

db.transactions.aggregate([
{$match: {"user_id": {
"$in": [ U1, U2]
}}},
{
$lookup: {
from: "transactions",
localField: "restaurant_id",
foreignField: "restaurant_id",
as: "related_taste"
}
}
])

最佳答案

你想要的是结果的“联合”,它是这样的:

db.transactions.aggregate([
{ "$match": { "user_id": { "$in": [ "U1", "U2" ] } }},
{ "$group": {
"_id": "$restaurant_id",
"users": { "$addToSet": "$user_id" }
}},
{ "$match": { "users": { "$all": [ "U1", "U2" ] } } }
])

给出输出:

{ "_id" : "R_4", "users" : [ "U2", "U1" ] }
{ "_id" : "R_1", "users" : [ "U2", "U1" ] }

这是如何工作的 $group阶段累积 restaurant_id 值并通过 $addToSet 保留“集合”该分组键存在的 user_id 值。

然后我们$match再次使用 $all条件以查看所提供的 user_id 值“都”存在于我们为其收集“集合”的餐厅中。

因此,只有“一个”列出的用户访问过的任何地方都将被丢弃,我们得到的结果只是两个都访问过的结果。


鉴于您的数据更正:

{ "user_id" : "U1", "restaurant_id" : "R_1" }
{ "user_id" : "U2", "restaurant_id" : "R_1" }
{ "user_id" : "U1", "restaurant_id" : "R_3" }
{ "user_id" : "U1", "restaurant_id" : "R_4" }
{ "user_id" : "U2", "restaurant_id" : "R_4" }

关于mongodb - 如何编写自连接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44603601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com