【问题标题】:mongodb select parent subdocument based on child subdocument's arraymongodb根据子子文档的数组选择父子文档
【发布时间】:2017-10-17 15:03:54
【问题描述】:

我正在尝试从志愿者收藏中获取 Mary Mack 的所有轮班列表,但我总是一无所获或什么都没有。有人可以帮帮我吗?我尝试了几种方法,下面列出了一些。

我希望数据看起来像:

where          date         time          details
__________________________________________________________
Registration   2017-06-24   8AM - NOON    check people in

我的志愿者数据如下所示:

{
  where: "Registration",
  description: "blah blah blah",
  shifts: [{
    dateNeeded: "2017-06-24",
    timeslot: "8AM - NOON",
    details: "check people in",
    volunteers: [{
      name: "Mary Mack",
      phone: 1234567890,
      email: "mary@mack.com"
    }]
  }] 
}

我试过了:

Volunteer.find({"shifts.volleyteers.email": "mary@mack.com" }, {         "shifts.$": 1, "where": 1 })

我也尝试过聚合和过滤:

Volunteer
  .aggregate(
    {$project: {where:1, shifts:1}}, 
    {$unwind: "$shifts"})

【问题讨论】:

    标签: angularjs mongodb mongoose


    【解决方案1】:

    你可以试试下面的聚合查询

    $matchvolunteersemail查找文档

    $project$arrayElemAtshift 数组转换为文档,然后$let 映射输出字段。

    aggregate({
        $match: {
            "shifts.volunteers.email": "mary@mack.com"
        }
    }, {
        $project: {
            where: 1,
            shifts: {
                $let: {
                    vars: {
                        doc: {
                            $arrayElemAt: ["$shifts", 0]
                        }
                    },
                    in: {
                        date: "$$doc.dateNeeded",
                        time: "$$doc.timeslot",
                        details: "$$doc.details"
                    }
                }
            }
        }
    })
    

    您还可以添加额外的$project 阶段而不是$let 运算符。

    aggregate({
        $match: {
            "shifts.volunteers.email": "mary@mack.com"
        }
    }, {
        $project: {
            where: 1,
            shift: {
                $arrayElemAt: ["$shifts", 0]
            }
        }
    }, {
        $project: {
            where: 1,
            date: "$shift.dateNeeded",
            time: "$shift.timeslot",
            details: "$shift.details"
        }
    })
    

    【讨论】:

    • 谢谢!!!您是否知道任何专门用于学习聚合管道的来龙去脉的好课程?我乐于学习,自己完成了一些事情,但这很艰难。您的解决方案非常有效!
    • 不客气。我主要从 MongoDB aggregation docs 学习,但我相信 Mongo University 有免费的在线课程。我不确定他们提供哪些关于聚合框架的课程。您可以在MongoDB user群发帖了解详情。
    猜你喜欢
    • 2019-07-25
    • 2019-06-25
    • 2016-03-12
    • 2017-06-29
    • 1970-01-01
    • 2012-03-06
    • 2014-08-27
    • 2023-03-28
    相关资源
    最近更新 更多