我是mongo的新手,正在努力解决以下问题.我有两个系列, struct 如下.就我个人而言,我不知道如何在学校藏品上查找$.在阅读其他帖子时,我肯定会使用ObjectId作为参考,同时也会用到国外领域.

以下是我的 struct :

Alumni:

{
    "_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
                }
            ]
        }
     ]
}

Schools

{
    _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"
                    }
                }
            ]
         }
     ]
}

我try 过的问题没有用:

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

任何帮助都将不胜感激!

推荐答案

在这种情况下,需要在聚合框架中使用$unwind和$project

请看下面:

db.alumni.aggregate([
    {$match: {_id: 'john'}},
    {$unwind:"$items"},
    {$unwind:"$items.items"},
    {$lookup: {
        from: 'schools', 
        localField: 'items.items.school', 
        foreignField: '_id', 
        as: 'schoolInfo'}},
    {$unwind:"$schoolInfo"},
    {$project:{
        "_id":1,
        "items":[{
            "name":"$items.name",
            "items":[{
            "school":"$schoolInfo._id"    ,
            "grad":"$items.items.grad"    ,
            "schoolInfo":"$schoolInfo"
            }]
        }]            
    }}
]).pretty()

要了解其工作原理,请try 从查询和判断文档 struct 中删除聚合阶段.

Mongodb相关问答推荐

通过mongoDB中的查找从管道中删除被阻止的用户

会话的Mongo-go驱动程序版本.Copy()

MongoDB-如何过滤和获取数组字段中的最新数据

如何将空值单独分组?

如何在Mongo中制作全覆盖索引

MongoDB MQL,将列表一分为二,仅获取唯一值

MongoDb聚合查询问题

使用 $addFields 将字段添加到 $lookup 结果中的每个项目

从 node.js 的 mongodb 集合中删除文档

在 MongoDb 中查询小于 NOW 的日期时间值

如何使用 mongoexport 导出排序数据?

Mongoose 和新架构:返回ReferenceError: Schema is not defined

$elemMatch 的 MongoDB 索引

如何根据其他字段添加条件模式?

在 Postgres JSON 数组中查询

MongoDb:如何将附加对象插入对象集合?

MongoDB 日志(log)文件和 oplog 有何不同?

如何在 MongoDB 中删除此弃用警告,为什么会这样?

对于社交网站(使用 Ruby on Rails 开发)来说,MongoDB 会是一个好主意吗?

无法从 mongodb 中删除集合