在 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】: $lookupproject 合集 $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`? [复制]

如何在 mongoDB 的第二级实现`lookup`? [复制]

如何使用 $lookup MongoDB 进行 LEFT JOIN

如何在 mongodb 中应用 $lookup 条件?

如何在 mongodb 中使用 $lookup $let 变量?