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表示用户应该是经理,但他的问题是他想找到该特定用户的所有垂直点。我猜他必须做出决定。