首页 > 解决方案 > 当foreignField在嵌套数组中时的$lookup

问题描述

我有两个系列:

学生

 {    
    _id: ObjectId("657..."),  
    name:'abc'
 },  
 {  
    _id: ObjectId("593..."),  
    name:'xyz'
 }

图书馆

 {    
    _id: ObjectId("987..."),  
    book_name:'book1',
    issued_to: [
      {
       student: ObjectId("657...")
      },
      {
       student: ObjectId("658...")
      }
    ]
 },  
 {  
    _id: ObjectId("898..."),  
    book_name:'book2',
    issued_to: [
     {
       student: ObjectId("593...")
     },
     {
       student: ObjectId("594...")
     }
   ] 
 }

我想加入一个存在于Library集合中对象字段的issue_to数组中的Student集合。

我想对学生收藏进行查询以获取学生数据以及图书馆收藏,如果学生存在或不存在,则将检查issued_to数组,否则获取图书馆文档。我试过 $lookup 的 mongo 3.6 但我没有成功。

db.student.aggregate([{$match:{_id: ObjectId("593...")}}, $lookup: {from: 'library', let: {stu_id:'$_id'}, pipeline:[$match:{$expr: {$and:[{"$hotlist.clientEngagement": "$$stu_id"]}}]}])

但它会引发错误,请在这方面帮助我。我还查看了在 stackoverflow 上提出的其他问题,例如。stackoverflow 上的问题,stackoverflow 上question2但这些是简单的字段而不是对象数组。请帮我

标签: mongodbmongodb-queryaggregation-framework

解决方案


我不确定我是否完全理解您的问题,但这应该可以帮助您:

db.student.aggregate([{
    $match: { _id: ObjectId("657...") }
}, {
    $lookup: {
        from: 'library',
        localField: '_id' ,
        foreignField: 'issued_to.student',
        as: 'result'
    }
}])

如果您只想获得book_name每个学生的 all ,您可以这样做:

db.student.aggregate([{
    $match: { _id: ObjectId("657657657657657657657657") }
}, {
    $lookup: {
        from: 'library',
        let: { 'stu_id': '$_id' },
        pipeline: [{
            $unwind: '$issued_to' // $expr cannot digest arrays so we need to unwind which hurts performance...
        }, {
            $match: { $expr: { $eq: [ '$issued_to.student', '$$stu_id' ] } }
        }, {
            $project: { _id: 0, "book_name": 1 } // only include the book_name field
        }],
        as: 'result'
    }
}])

推荐阅读