MongoDB lookup查询如何排除关联表中布尔字段为false的记录
你的需求可以实现,你原有写法的问题在于$lookup返回的photoData是数组类型,直接用$eq判断$photoData.published无法对数组内的单个元素字段生效,以下是两种可行的实现方案:
方案1:在$lookup阶段直接过滤(推荐,性能更高)
这个方案在关联阶段就过滤掉不符合要求的photos记录,减少后续计算开销,需要MongoDB 3.6及以上版本支持:
const pipeline = [ { '$lookup': { 'from': 'photos', 'let': { 'parentId': '$_id' }, 'pipeline': [ { '$match': { // 匹配关联条件 '$expr': { '$eq': [ '$postId', '$$parentId' ] }, // 直接过滤published为true的记录 'published': true }} ], 'as': 'photoData' } }, { '$project': { 'createdAt': 1, // 其他需要返回的字段 'photoData': 1 } } ]
方案2:在$project阶段用$filter过滤
如果你希望保持原有$lookup逻辑,只修改$project部分,可以用$filter操作符对数组内元素做过滤:
const pipeline = [ { '$lookup': { 'from': 'photos', 'localField': '_id', 'foreignField': 'postId', 'as': 'photoData' } }, { '$project': { 'createdAt': 1, // 其他需要返回的字段 'photoData': { '$filter': { 'input': '$photoData', 'cond': { '$eq': [ '$$this.published', true ] } } } } } ]
过滤后的photoData会保留所有published为true的关联记录,如果没有符合条件的记录则返回空数组;如果你希望无符合条件记录时直接移除整个photoData字段,可以在$filter外层再加$cond判断数组长度为0时返回$$REMOVE即可。
内容的提问来源于stack exchange,提问作者Ray Purchase
相关产品推荐
相关产品推荐

