嵌套文档上的MongoDB $查找

时间:2016-03-15 21:23:55

标签: mongodb mongodb-query

我是mongo的新手,并且正在努力与以下人员进行斗争。我有2个收集结构如下。对于我的生活,我无法弄清楚如何对学校集合进行$ lookup。阅读其他帖子,我肯定使用ObjectId作为参考和外国领域。

以下是我的结构:

校友:

{
    "_id": "john",
    "items": [
        {
            "name": "John",
            "items": [
                {
                    "school": ObjectId("56de35ab520fc05b2fa3d5e4"),
                    "grad": true
                },
                {
                    "school": ObjectId("56de35ab520fc05b2fa00000"),
                    "grad": false
                }
            ]
        },
        {
            "name": "Johnny"
            // notice no nested items, this doc should still be included in result
        },
        {
            "name": "Jon",
            "items": [
                {
                    "school": ObjectId("56de35ab520fc05b2fa11111"),
                    "grad": false
                }
            ]
        }
     ]
}

学校

{
    _id: ObjectId("56de35ab520fc05b2fa3d5e4"),
    name: "Some University",
    street: "ABC Boulevard"
}

我想要得到的东西:

{
    "_id": "john",
    "items": [
        {
            "name": "John",
            "items": [
                {
                    "school": ObjectId("56de35ab520fc05b2fa3d5e4"),
                    "grad": true,
                    "schoolInfo":     {
                        _id: ObjectId("56de35ab520fc05b2fa3d5e4"),
                        name: "Some University",
                        street: "ABC Boulevard"
                    }
                },
                {
                    "school": ObjectId("56de35ab520fc05b2fa00000"),
                    "grad": true,
                    "schoolInfo":     {
                        _id: ObjectId("56de35ab520fc05b2fa00000"),
                        name: "Another University",
                        street: "123 Boulevard"
                    }
                }
            ]
        },
        {
            name: "Johnny"
        },
        {
            "name": "Jon",
            "items": [
                {
                    "school": ObjectId("56de35ab520fc05b2fa11111"),
                    "grad": true,
                    "schoolInfo":     {
                        _id: ObjectId("56de35ab520fc05b2fa11111"),
                        name: "Some University",
                        street: "ABC Boulevard"
                    }
                }
            ]
         }
     ]
}

我试过的查询无效:

db.alumni.aggregate([
      {$match: {_id: 'john'}}, 
      {$lookup: {
                from: 'schools', 
                localField: 'items.items.school', 
                foreignField: '_id', 
                as: 'schoolInfo'}}
 ])

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:26)

在这种情况下,需要在聚合框架中使用$ unwind和$ project进行一个很好的游戏

请参阅以下内容:

A

了解它是如何工作的 - 尝试从查询中删除聚合阶段并检查文档结构。

答案 1 :(得分:5)

这会更好地处理db.alumni.aggregate([ {$match: {_id: 'john'}}, {$unwind:"$items"}, {$unwind:"$items.items"}, {$lookup: { from: 'schools', localField: 'items.items.school', foreignField: '_id', as: 'schoolInfo'}}, {$unwind:"$schoolInfo"}, {$group:{ _id: { _id: '$_id', name: '$items.name', }, items: { $push: { 'grad': '$items.items.grad', 'school': '$schoolInfo._id' 'schoolInfo': '$schoolInfo' } } }}, {$group:{ _id: '$_id._id', items: { $push: { 'name': '$_id.name', 'items': '$items' } } }} ]).pretty() 阵列中的多所学校吗?

$items.items

我没有解决丢失{ name: "Johnny", items: [], }, 的情况,但您可以查看$unwind empty array 此外,如果没有条目,最好留空数组而不是空,即

{{1}}