Node.js 单个集合的聚合查询
我的数据库包含一个用户Node.js 单个集合的聚合查询,node.js,mongodb,aggregation-framework,mongodb-aggregation,Node.js,Mongodb,Aggregation Framework,Mongodb Aggregation,我的数据库包含一个用户集合,格式如下: { "userId": "12345", "vertical": "BFS", "Role": "Manager" }, { "userId": "12345", "vertical": "Insurance", "Role": "Manager" }, { "userId": "12367", "vertical": "BFS", "Role": "Associate" } 我知道
集合
,格式如下:
{
"userId": "12345",
"vertical": "BFS",
"Role": "Manager"
},
{
"userId": "12345",
"vertical": "Insurance",
"Role": "Manager"
},
{
"userId": "12367",
"vertical": "BFS",
"Role": "Associate"
}
我知道vertical
和manager
,从中我必须找到userId
。然后我必须找到特定用户的垂直
就像在SQL中一样:
select vertical
from user
where role="Manager"
and userid in (
select userid from user
where vertical="BFS" and role="Manager"
)
请帮忙。我是这项技术的新手。问题:我们希望获得数据,了解在BFS垂直业务中,一名经理在其他垂直业务中也扮演着经理的角色
我将使用MongoDB中提供的聚合框架来处理这个问题
下面是对以下查询中每个管道的解释
1) $Match-获取角色为经理的所有数据,因为我们只对经理角色感兴趣
2) $project-只是将字段投影到下一个管道的临时管道
3) $group—类似于SQL,可按用户ID对数据进行分组,并将其垂直方向添加到数组中
4) $Match-在用户ID是BFS的一部分时筛选用户ID
db.vertical.aggregate([
{$match : { "Role": "Manager"}},
{$project : { "userId" : 1, "vertical" : 1, "Role" : 1}},
{$group : { _id : "$userId", "verticalsArray" : {$push : "$vertical"} } },
{$match : { "verticalsArray": "BFS"}},
]);
输出:-
{
"_id" : "12345",
"verticalsArray" : [
"BFS",
"Insurance"
]
}
问题:我们希望获得的数据是BFS垂直行业的一位经理在其他垂直行业也扮演着经理的角色
我将使用MongoDB中提供的聚合框架来处理这个问题
下面是对以下查询中每个管道的解释
1) $Match-获取角色为经理的所有数据,因为我们只对经理角色感兴趣
2) $project-只是将字段投影到下一个管道的临时管道
3) $group—类似于SQL,可按用户ID对数据进行分组,并将其垂直方向添加到数组中
4) $Match-在用户ID是BFS的一部分时筛选用户ID
db.vertical.aggregate([
{$match : { "Role": "Manager"}},
{$project : { "userId" : 1, "vertical" : 1, "Role" : 1}},
{$group : { _id : "$userId", "verticalsArray" : {$push : "$vertical"} } },
{$match : { "verticalsArray": "BFS"}},
]);
输出:-
{
"_id" : "12345",
"verticalsArray" : [
"BFS",
"Insurance"
]
}
这种情况会不会中断-{“userId”:“12345”,“vertical”:“BFS”,“Role”:“Manager”},{“userId”:“12345”,“vertical”:“Insurance”,“Role”:“Associate”}因为他需要查找用户id 12345的所有垂直项。不,不会。我已经尝试了问题中给出的样本数据,我的答案具有假设我正确理解您的问题的输出。我在回答中也总结了我的理解。对于我提供的数据,这将是一个突破。对于不同的垂直方向,一个人可以有不同的名称。您的$match阶段将删除userid 12345的文档,其中他不是经理,您将无法获取该文档的垂直位置。我查询中的最后一个匹配(步骤4)等于数组包含BFS。如果数组具有BFS和保险,它将在输出中获取用户id。只是确认一下,这是经过测试的代码,对于您提供的数据来说,它运行良好。我理解您的意思。他的SQL表示用户应该是经理,但他的问题是他想找到该特定用户的所有垂直点。我猜他必须做出决定。这样的事情会不会中断-{“userId”:“12345”,“vertical”:“BFS”,“Role”:“Manager”},{“userId”:“12345”,“vertical”:“Insurance”,“Role”:“Associate”},因为他需要找到用户id 12345的所有垂直项。不,不会。我已经尝试了问题中给出的样本数据,我的答案具有假设我正确理解您的问题的输出。我在回答中也总结了我的理解。对于我提供的数据,这将是一个突破。对于不同的垂直方向,一个人可以有不同的名称。您的$match阶段将删除userid 12345的文档,其中他不是经理,您将无法获取该文档的垂直位置。我查询中的最后一个匹配(步骤4)等于数组包含BFS。如果数组具有BFS和保险,它将在输出中获取用户id。只是确认一下,这是经过测试的代码,对于您提供的数据来说,它运行良好。我理解您的意思。他的SQL表示用户应该是经理,但他的问题是他想找到该特定用户的所有垂直点。我猜他必须做出决定。