在 MongoDB 中进行 $lookup 时访问另一个对象数组中的值
Posted
技术标签:
【中文标题】在 MongoDB 中进行 $lookup 时访问另一个对象数组中的值【英文标题】:Accessing values from another array of objects while doing $lookup in MongoDB 【发布时间】:2021-08-23 17:52:57 【问题描述】:有两个集合,用户和项目。
用户对象:
_id: ObjectId(SOME_ID),
name: "Full Name",
projects: [projectIdA, projectIdB]
lastAccessed: [
id: projectIdA,
ts: date1
,
id: projectIdB,
ts: date2
]
项目对象:
_id: projectIdA,
name: "Project 1",
desc: "Some Desc"
现在,当我想获取用户详细信息时,我希望存储在用户集合的项目数组中的每个项目 ID 的项目详细信息以及最后一次访问。
喜欢这个回复-
_id: ObjectId(SOME_ID),
name: "Full Name",
projects: [
id: projectIdA,
name: "Project 1",
desc: "Some Desc",
ts: date1
,
id: projectIdB,
name: "Project 2",
desc: "Some Desc",
ts: date1
,
]
可以使用 MongoDB 中的$lookup
添加项目集合中的项目详细信息。但是如何访问每个项目的lastAccessed
字段呢?
【问题讨论】:
【参考方案1】:$lookup
与 project
合集
$map
迭代 lastAccessed
数组的循环
$filter
迭代 projects
数组和过滤匹配项目的循环
$arrayElemAt
从上面过滤的项目中获取第一个元素
$mergeObejcts
将当前对象字段与结果字段合并
db.user.aggregate([
$lookup:
from: "project",
localField: "projects",
foreignField: "_id",
as: "projects"
,
$project:
name: 1,
projects:
$map:
input: "$lastAccessed",
as: "l",
in:
$mergeObjects: [
"$$l",
$arrayElemAt: [
$filter:
input: "$projects",
cond: $eq: ["$$this._id", "$$l.id"]
,
0
]
]
])
Playground
【讨论】:
如果元素存在于 lastAccessed 数组中,它可以正常工作。但是如果元素不存在,是否有任何选项可以显示 null? 不,很难显示所有字段为null,我建议您可以在查询后在前端进行。 如果元素存在于项目数组中但不存在于 lastAccessed 中,则应显示 null。但它没有发生。有什么办法吗? 当我在 $map 中将 "$lastAccessed" 替换为 "$projects" 并尝试与 lastAccessed 合并时,它起作用了以上是关于在 MongoDB 中进行 $lookup 时访问另一个对象数组中的值的主要内容,如果未能解决你的问题,请参考以下文章
如何在 mongoDB 的第二级实现`lookup`? [复制]
如何在 mongoDB 的第二级实现`lookup`? [复制]