MongoDB聚合:_id由_id查找,然后获取第一个元素值

Gra*_*nga 3 mongodb aggregation-framework mongodb-aggregation

当我这样做时$lookup,在我的情况下foreignField:"_id",我在数组中得到找到的元素.下面是从后输出一个文档$lookup已经做了检索fromUser,并toUserusers集合:

{ 
    _id : { from : 57b8da368e4a6e1f0043cb3d, to : 57c381af7008e51f009d92df }, 
    fromUser : [
        {
            _id : 57b8da368e4a6e1f0043cb3d, 
            userName: "A"
        }
    ], 
    toUser : [
        {
            _id : 57c381af7008e51f009d92df, 
            userName: "B"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

你可以注意到fromUser并且toUser是数组.如何投射fromUser,toUser而不是数组,他们只包含用户的userName,如下所示:

{
    _id : { from : 57b8da368e4a6e1f0043cb3d, to : 57c381af7008e51f009d92df },
    fromUser: "A",
    toUser: "B"
}
Run Code Online (Sandbox Code Playgroud)

DAX*_*lic 10

你可以通过$project使用$ arrayElemAt运算符将一个阶段附加到聚合管道来实现这一点

// your previous stages incl. lookup
...
$project: {
    fromUser: { $arrayElemAt: ["$fromUser.userName", 0] },
    toUser: { $arrayElemAt: ["$toUser.userName", 0] }
}
...
Run Code Online (Sandbox Code Playgroud)

  • 你今天教我三件事:格式化,更仔细地阅读文档,以及答案.谢谢! (4认同)

小智 6

如果你想获取数组中的第一个元素,那么你可以使用$first运算符(4.4 版本中的新增功能),并且它使用起来很简单。

{
    $set: {
        fromUser: {
            $first: "$fromUser.userName" 
        },
        toUser: {
            $first: "$toUser.userName" 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您想获取数组中第一个元素以外的元素,则可以使用$arrayElemAt运算符。