MongoDB-对主表中的多个列应用类似的查找

MongoDB-对主表中的多个列应用类似的查找,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我是MongoDB的新手,我正在尝试收集学生的完整细节,并参考其他收藏 学生收集结构: { "_id" : ObjectId("5cc973dd008221192148177a"), "name" : "James Paulson", "teachers" : [ ObjectId("5cc973dd008221192148176f"), ObjectId("5cc973dd0082211921481770") ], "

我是MongoDB的新手,我正在尝试收集学生的完整细节,并参考其他收藏

学生
收集结构:

{
    "_id" : ObjectId("5cc973dd008221192148177a"),
    "name" : "James Paulson",
    "teachers" : [ 
        ObjectId("5cc973dd008221192148176f"), 
        ObjectId("5cc973dd0082211921481770")
    ],
    "attenders": [ 
        ObjectId("5cc973dd0082211921481732"), 
        ObjectId("5cc973dd008221192148173f")
    ]
}
{
    "_id" : ObjectId("5cc973dd008221192148176f"),
    "name" : "John Paul",
    "subject" : [ 
        "english", 
        "maths"
    ]
}
{
    "_id" : ObjectId("5cc973dd0082211921481771"),
    "name" : "Pattrick",
    "subject" : [ 
        "physics", 
        "history"
    ]
}
{
    "_id" : ObjectId("5cc973dd0082211921481732"),
    "name" : "Roger",
    "subject" : [ 
        "sweeper"
    ]
}
{
    "_id" : ObjectId("5cc973dd008221192148173f"),
    "name" : "Ken",
    "subject" : [ 
        "dentist"
    ]
}
db.getCollection('students').aggregate([
  {
    $unwind: "$teachers"
  },      
  {
    $lookup:
    {
        from: 'staff',
        localField: 'teachers',
        foreignField: '_id',
        as: 'teachers'
    }
  }
]);
{
    "_id" : ObjectId("5cc973dd008221192148177a"),
    "name" : "James Paulson",
    "teachers" : [ 
        {
            "_id" : ObjectId("5cc973dd008221192148176f"),
            "name" : "John Paul",
            "subject" : [ 
                "english", 
                "maths"
            ]
        }, 
        {
            "_id" : ObjectId("5cc973dd008221192148176f"),
            "name" : "Pattrick",
            "subject" : [ 
                "physics", 
                "history"
            ]
        }
    ],
    "attenders": [ 
        ObjectId("5cc973dd0082211921481732"), 
        ObjectId("5cc973dd008221192148173f")
    ]
}
员工
收集结构:

{
    "_id" : ObjectId("5cc973dd008221192148177a"),
    "name" : "James Paulson",
    "teachers" : [ 
        ObjectId("5cc973dd008221192148176f"), 
        ObjectId("5cc973dd0082211921481770")
    ],
    "attenders": [ 
        ObjectId("5cc973dd0082211921481732"), 
        ObjectId("5cc973dd008221192148173f")
    ]
}
{
    "_id" : ObjectId("5cc973dd008221192148176f"),
    "name" : "John Paul",
    "subject" : [ 
        "english", 
        "maths"
    ]
}
{
    "_id" : ObjectId("5cc973dd0082211921481771"),
    "name" : "Pattrick",
    "subject" : [ 
        "physics", 
        "history"
    ]
}
{
    "_id" : ObjectId("5cc973dd0082211921481732"),
    "name" : "Roger",
    "subject" : [ 
        "sweeper"
    ]
}
{
    "_id" : ObjectId("5cc973dd008221192148173f"),
    "name" : "Ken",
    "subject" : [ 
        "dentist"
    ]
}
db.getCollection('students').aggregate([
  {
    $unwind: "$teachers"
  },      
  {
    $lookup:
    {
        from: 'staff',
        localField: 'teachers',
        foreignField: '_id',
        as: 'teachers'
    }
  }
]);
{
    "_id" : ObjectId("5cc973dd008221192148177a"),
    "name" : "James Paulson",
    "teachers" : [ 
        {
            "_id" : ObjectId("5cc973dd008221192148176f"),
            "name" : "John Paul",
            "subject" : [ 
                "english", 
                "maths"
            ]
        }, 
        {
            "_id" : ObjectId("5cc973dd008221192148176f"),
            "name" : "Pattrick",
            "subject" : [ 
                "physics", 
                "history"
            ]
        }
    ],
    "attenders": [ 
        ObjectId("5cc973dd0082211921481732"), 
        ObjectId("5cc973dd008221192148173f")
    ]
}
这是我用于检索特定学生的所有教师详细信息的查询

查询:

{
    "_id" : ObjectId("5cc973dd008221192148177a"),
    "name" : "James Paulson",
    "teachers" : [ 
        ObjectId("5cc973dd008221192148176f"), 
        ObjectId("5cc973dd0082211921481770")
    ],
    "attenders": [ 
        ObjectId("5cc973dd0082211921481732"), 
        ObjectId("5cc973dd008221192148173f")
    ]
}
{
    "_id" : ObjectId("5cc973dd008221192148176f"),
    "name" : "John Paul",
    "subject" : [ 
        "english", 
        "maths"
    ]
}
{
    "_id" : ObjectId("5cc973dd0082211921481771"),
    "name" : "Pattrick",
    "subject" : [ 
        "physics", 
        "history"
    ]
}
{
    "_id" : ObjectId("5cc973dd0082211921481732"),
    "name" : "Roger",
    "subject" : [ 
        "sweeper"
    ]
}
{
    "_id" : ObjectId("5cc973dd008221192148173f"),
    "name" : "Ken",
    "subject" : [ 
        "dentist"
    ]
}
db.getCollection('students').aggregate([
  {
    $unwind: "$teachers"
  },      
  {
    $lookup:
    {
        from: 'staff',
        localField: 'teachers',
        foreignField: '_id',
        as: 'teachers'
    }
  }
]);
{
    "_id" : ObjectId("5cc973dd008221192148177a"),
    "name" : "James Paulson",
    "teachers" : [ 
        {
            "_id" : ObjectId("5cc973dd008221192148176f"),
            "name" : "John Paul",
            "subject" : [ 
                "english", 
                "maths"
            ]
        }, 
        {
            "_id" : ObjectId("5cc973dd008221192148176f"),
            "name" : "Pattrick",
            "subject" : [ 
                "physics", 
                "history"
            ]
        }
    ],
    "attenders": [ 
        ObjectId("5cc973dd0082211921481732"), 
        ObjectId("5cc973dd008221192148173f")
    ]
}
结果:

{
    "_id" : ObjectId("5cc973dd008221192148177a"),
    "name" : "James Paulson",
    "teachers" : [ 
        ObjectId("5cc973dd008221192148176f"), 
        ObjectId("5cc973dd0082211921481770")
    ],
    "attenders": [ 
        ObjectId("5cc973dd0082211921481732"), 
        ObjectId("5cc973dd008221192148173f")
    ]
}
{
    "_id" : ObjectId("5cc973dd008221192148176f"),
    "name" : "John Paul",
    "subject" : [ 
        "english", 
        "maths"
    ]
}
{
    "_id" : ObjectId("5cc973dd0082211921481771"),
    "name" : "Pattrick",
    "subject" : [ 
        "physics", 
        "history"
    ]
}
{
    "_id" : ObjectId("5cc973dd0082211921481732"),
    "name" : "Roger",
    "subject" : [ 
        "sweeper"
    ]
}
{
    "_id" : ObjectId("5cc973dd008221192148173f"),
    "name" : "Ken",
    "subject" : [ 
        "dentist"
    ]
}
db.getCollection('students').aggregate([
  {
    $unwind: "$teachers"
  },      
  {
    $lookup:
    {
        from: 'staff',
        localField: 'teachers',
        foreignField: '_id',
        as: 'teachers'
    }
  }
]);
{
    "_id" : ObjectId("5cc973dd008221192148177a"),
    "name" : "James Paulson",
    "teachers" : [ 
        {
            "_id" : ObjectId("5cc973dd008221192148176f"),
            "name" : "John Paul",
            "subject" : [ 
                "english", 
                "maths"
            ]
        }, 
        {
            "_id" : ObjectId("5cc973dd008221192148176f"),
            "name" : "Pattrick",
            "subject" : [ 
                "physics", 
                "history"
            ]
        }
    ],
    "attenders": [ 
        ObjectId("5cc973dd0082211921481732"), 
        ObjectId("5cc973dd008221192148173f")
    ]
}
如您所见,
attenders
数组与
teachers
相似,只是在students表中的列名不同。那么,如何对第二列(
attenders
)应用类似的查询呢?还有什么方法可以从第二个表中选择特定的列(例如从
staff
集合中仅选择
\u id
name


在此方面的任何帮助都将不胜感激。

您可以在mongodb3.6及以上版本中使用下面的聚合

首先,您不需要在这里使用,因为您的字段已经包含
ObjectId
s的数组。要从引用的集合中选择特定字段,可以使用自定义的with pipeline及其内部的字段

db.getCollection('students').aggregate([
  { "$lookup": {
    "from": "staff",
    "let": { "teachers": "$teachers" },
    "pipeline": [
       { "$match": { "$expr": { "$in": [ "$_id", "$$teachers" ] } } }
       { "$project": { "name": 1 }}
     ],
     "as": "teachers"
  }},
  { "$lookup": {
    "from": "attenders",
    "let": { "attenders": "$attenders" },
    "pipeline": [
       { "$match": { "$expr": { "$in": [ "$_id", "$$attenders" ] } } }
     ],
     "as": "attenders"
  }}
])

嗨,谢谢你的回答。我收到一个错误,
error:command失败:{“ok”:0,“errmsg”:“$in需要一个数组作为第二个参数,发现:缺少”,“code”:40081,“codeName”:“Location40081”}:聚合失败
这是数据问题吗?是的。请看一看