表一:
"_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'])))这种方式就可以了,但是二级数组我就抓瞎了.
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()
补充一个问题呢, 就是如果table1和table2里面有其他字段,怎么都提取出来呢?而不是再project里面挨个加字段.
.unwind('$alist')
.lookup({
from: 'table2',
let: {
list: '$alist',
},
pipeline: $.pipeline()
.match(_.expr($.in([true, $.map({
input: '$$list',
as: 'item',
in: $.eq(['$aAid', '$$item']),
})])))
.done(),
as: 'bookList',
})
pipeline: $.pipeline()
.match(_.expr($.in(['$aAid', '$$list'])))
.done(),
就是在table1表中,还有其他字段
譬如blist:xxxx,clist:[100,101,200,101]
怎么样把全部字段都加进返回结果.
我目前只想到了一个办法就是在group中用addtoset来挨个添加额外的字段
还有一个问题就是,如何在unwind后的lookup中,按照alist中的顺序进行排序, 上面的代码是按照table2中的aAid进行排序的.
.group({
_id: '$_id',
bookList: $.push('$bookList'),
clist: $.first('$clist'),
})