当我执行
$lookup
时(在我的例子中是 foreignField:"_id"
),我会在数组中找到找到的元素。以下是完成 $lookup
从 fromUser
集合中检索 toUser
和 users
后输出的一份文档:
{
_id : { from : 57b8da368e4a6e1f0043cb3d, to : 57c381af7008e51f009d92df },
fromUser : [
{
_id : 57b8da368e4a6e1f0043cb3d,
userName: "A"
}
],
toUser : [
{
_id : 57c381af7008e51f009d92df,
userName: "B"
}
]
}
您可以注意到
fromUser
和 toUser
是数组。如何投影 fromUser
和 toUser
,以便它们不包含数组,而只包含用户的 userName
,如下所示:
{
_id : { from : 57b8da368e4a6e1f0043cb3d, to : 57c381af7008e51f009d92df },
fromUser: "A",
toUser: "B"
}
您可以通过使用
$arrayElemAt运算符将
$project
阶段附加到聚合管道来实现这一点,如下所示
// your previous stages incl. lookup
...
$project: {
fromUser: { $arrayElemAt: ["$fromUser.userName", 0] },
toUser: { $arrayElemAt: ["$toUser.userName", 0] }
}
...
如果你想获取数组中的第一个元素,那么你可以使用 $first 运算符(4.4 版本新增),使用起来很简单。
{
$set: {
fromUser: {
$first: "$fromUser.userName"
},
toUser: {
$first: "$toUser.userName"
}
}
}
如果您想获取数组中第一个元素以外的元素,则可以使用 $arrayElemAt 运算符。