收藏
回答

请教lookup pipeline如何查询二级数组?

表一:
"_id":"2a0398605f1114*****d69a167ebf9ed"
"alist":[[100,101],[200,201],[300,301]]
表二:
"_id":"xxxxxxxxx"
"name":"A"
"aAid":100
------------
"_id":"xxxxxxxxx"
"name":"B"
"aAid":101
--------------
"_id":"xxxxxxxxx"
"name":"C"
"aAid":200
依次

现在想查找出这样的结果
 alist:[
  {
    {aAid:100,name:"A"},
    {aAid:101,name:"B"},
  }{
    {aAid:200,name:"C"},
    {aAid:201,name:"C"},
  }
  ...
]
alist如果是一级数组,我知道直接用.match(_.expr($.in(['$aAid''$$alist'])))这种方式就可以了,但是二级数组我就抓瞎了.
最后一次编辑于  2021-09-22
回答关注问题邀请回答
收藏

1 个回答

  • Mr.Zhao
    Mr.Zhao
    2021-09-23
    db.collection('table1')
    .aggregate()
    .unwind('$alist')
    .lookup({
    from: 'table2',
    let: {
    list: '$alist',
    },
    pipeline: $.pipeline()
    .project({
    test: $.map({
    input: '$$list',
    as: 'num',
    in: $.eq(['$aAid', '$$num']),
    }),
    aAid: 1,
    name: 1
    })
    .match({
    test: _.in([true])
    })
    .project({
    _id: 0,
    test: 0
    })
    .done(),
    as: 'bookList',
    })
    .project({
    alist: 0,
    })
    .addFields({
    bsize: $.size('$bookList')
    })
    .match({
    bsize: _.gt(0)
    })
    .group({
    _id: '$_id',
    alist: $.push('$bookList')
    })
    .end()
    

    2021-09-23
    有用 1
    回复 5
    • JuniusXIV
      JuniusXIV
      2021-09-23
      非常感谢,实现了unwind后再次聚合的效果了.
      补充一个问题呢, 就是如果table1和table2里面有其他字段,怎么都提取出来呢?而不是再project里面挨个加字段.
      2021-09-23
      回复
    • JuniusXIV
      JuniusXIV
      2021-09-23
      我用这样子的代码解决了 table2的全部字段问题, 但是table1的全部字段尚未解决,在group中用addtoset或者push来添加额外的字段的话,会把字段变成二维数组形式.
      2021-09-23
      回复
    • JuniusXIV
      JuniusXIV
      2021-09-23
      好像还可以进一步简化一下
      2021-09-23
      回复
    • Mr.Zhao
      Mr.Zhao
      2021-09-23回复JuniusXIV
      我是为了得到结果硬写的 没想太多
      2021-09-23
      1
      回复
    • JuniusXIV
      JuniusXIV
      2021-09-23回复Mr.Zhao
      追加一个问题
      就是在table1表中,还有其他字段
      譬如blist:xxxx,clist:[100,101,200,101]
      怎么样把全部字段都加进返回结果.
      我目前只想到了一个办法就是在group中用addtoset来挨个添加额外的字段
      还有一个问题就是,如何在unwind后的lookup中,按照alist中的顺序进行排序, 上面的代码是按照table2中的aAid进行排序的.
      2021-09-23
      回复
登录 后发表内容