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

问题描述 投票:0回答:2

当我执行

$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"
}
mongodb aggregation-framework mongodb-aggregation
2个回答
46
投票

您可以通过使用

$arrayElemAt
运算符将 $project 阶段附加到聚合管道来实现这一点,如下所示

// your previous stages incl. lookup
...
$project: {
    fromUser: { $arrayElemAt: ["$fromUser.userName", 0] },
    toUser: { $arrayElemAt: ["$toUser.userName", 0] }
}
...

6
投票

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

{
    $set: {
        fromUser: {
            $first: "$fromUser.userName" 
        },
        toUser: {
            $first: "$toUser.userName" 
        }
    }
}

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

© www.soinside.com 2019 - 2024. All rights reserved.