云开发lookup连表查询主表不能指定条件吗,现在主表与另一个表match不匹配主表的记录也返回,意思主表有几条记录就返回几条。
book表
[
{ type: 1, detailId: 2001, _id: xxxx12323},
{ typ: 0, detailId: 67676, _id: xxxx90909}
]
order表
[
{ detailId: 2001, _id: xxsdd,num: 3},
{ detailId: 9999, _id: xxxgyg, num: 999}
]
1、想查book表type=1,且book表detailId等于order表detailId的记录。预期输出:
{ type: 1, detailId: 2001, _id: xxxx12323, num: 3}
2、真实输出(条件不匹配的主表记录也返回了):
{ type: 1, detailId: 2001, _id: xxxx12323, num: 3},
{ typ: 0, detailId: 67676, _id: xxxx90909} //这个没有匹配的也返回了
3、代码如下(麻烦注意这个代码$.eq([1, '$$book_type']):
const _ = db.command
const $ = _.aggregate
const result = await db.collection('book').aggregate()
.lookup({
from: 'order',
let: {
book_dId: '$detailId',
book_type: '$type'
},
pipeline: $.pipeline()
.match(_.expr($.and([
$.eq(['$detailId', '$$book_dId']),
//想在这加主表的过滤内容type=1貌似不起作用,想不到还有哪个地方可以放判断主表type=1的条件
$.eq([1, '$$book_type'])
])))
.done(),
as: 'collectionList',
})
.replaceRoot({
newRoot: $.mergeObjects([$.arrayElemAt(['$collectionList', 0]), '$$ROOT'])
})
.project({
collectionList: 0
})
.end()
$.eq([1, '$$book_type']这个是想判断找出主表type=1的记录,不起作用,有没有其他方法判断主表type=1(即主表与另一个表条件不匹配的记录不返回)
match
{ type: 1, detailId: 2001•, _id: xxxx12323, num: 3},
{ typ: 0, detailId: 67676•, _id: xxxx90909} //这个没有匹配的也返回了
const _ = db.command
const $ = _.aggregate
const result = await db.collection('book').aggregate()
.lookup({
from: 'order',
let: {
book_dId: '$detailId',
book_type: '$type'
},
pipeline: $.pipeline()
.match(_.expr($.and([
$.eq(['$detailId', '$$book_dId']),
//想在这加主表的过滤内容type=1貌似不起作用,想不到还有哪个地方可以放判断•主表type=1的条件
$.eq([1, '$$book_type'])
])))
.done(),
as: 'collectionList',
})
.replaceRoot({
newRoot: $.mergeObjects([$.arrayElemAt(['$collectionList', 0]), '$$ROOT'])
})
.project({
collectionList: 0
})
.end()
请问,这个问题,最后解决了么?怎么解决的!
db.collection('book').aggregate().addFileds(type:1)....然后下面的匹配条件里面的定值1改成$type 试试