
本文将深入探讨如何在 MongoDB 的 $lookup 聚合管道中,将本地文档的字段值添加到查找结果中。通常,$lookup 用于关联不同集合的数据,但有时我们需要在关联的同时,保留原始文档中的某些特定信息。本教程将提供一种解决方案,通过结合 $map、$mergeObjects 和 $arrayElemAt 操作符,实现这一目标。
假设我们有一个 User 集合,其中包含用户信息以及一个 inbox 字段,该字段是一个包含参与者 _id 和 added_at 时间戳的数组。我们的目标是使用 $lookup 关联 Users 集合自身,根据 inbox.participant 字段查找参与者信息,并在结果中保留每个参与者的 added_at 时间戳。
以下是一个示例 User 文档的结构:
{
"_id": ObjectId("123456789xx"),
"first_name": "Sam",
"last_name": "Jones",
"email": "[email protected]",
"inbox": [
{
"participant": ObjectId("1XXXXXXXXX"),
"added_at": "12:00:00 09/21/2021"
},
{
"participant": ObjectId("2XXXXXXXXX"),
"added_at": "12:00:00 11/21/2022"
}
]
}以下是实现该目标的聚合管道:
db.Users.aggregate([
{
$lookup: {
from: "Users",
localField: "inbox.participant",
foreignField: "_id",
as: "participants",
pipeline: [{ $project: { first_name: 1, last_name: 1, _id: 1 } }],
},
},
{
$set: {
participants: {
$map: {
input: "$participants",
in: {
$mergeObjects: [
"$$this",
{
added_at: {
$arrayElemAt: [
"$inbox.added_at",
{
$indexOfArray: ["$inbox.participant", "$$this._id"],
},
],
},
},
],
},
},
},
},
},
]);代码解析:
$lookup 阶段: 此阶段执行基本的查找操作,将 inbox.participant 字段与 Users 集合的 _id 字段进行匹配,并将匹配到的结果存储在 participants 数组中。pipeline 选项用于指定要从匹配的文档中返回的字段,这里我们只返回 first_name、last_name 和 _id 字段。
$set 阶段: 此阶段使用 $map 操作符遍历 participants 数组,并使用 $mergeObjects 操作符将每个参与者的信息与对应的 added_at 时间戳合并。$arrayElemAt 和 $indexOfArray 操作符用于查找与当前参与者 _id 对应的 added_at 时间戳。
注意事项:
总结:
通过结合 $lookup、$map、$mergeObjects 和 $arrayElemAt 操作符,我们可以灵活地控制 $lookup 聚合管道的输出,并在关联查询的同时,保留原始文档中的特定字段。这种方法在需要丰富查询结果并提供更多上下文信息的场景中非常有用。理解这些操作符的用法对于构建复杂的 MongoDB 聚合管道至关重要。
以上就是MongoDB:在 $lookup 管道中使用 localField 添加字段的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号