MongoDB如何查询与指定编辑器link属性一致的关联所有者数据
实现方案
基础查询(仅返回关联作曲人数据)
你可以使用MongoDB聚合管道实现需求,指定编辑器codigo_ecad为5546730的查询语句如下:
db.works.aggregate([ // 第一步:过滤包含目标编辑器的作品 { $match: { 'pro_owners.codigo_ecad': 5546730 } }, // 第二步:展开所有者数组 { $unwind: '$pro_owners' }, // 第三步:分组获取目标编辑器对应的所有link值,同时收集所有所有者待后续筛选 { $group: { _id: '$_id', target_links: { $addToSet: { $cond: [ { $eq: ['$pro_owners.codigo_ecad', 5546730] }, '$pro_owners.link', null ] } }, all_owners: { $push: '$pro_owners' } } }, // 第四步:过滤掉空的link值 { $addFields: { target_links: { $filter: { input: '$target_links', cond: { $ne: ['$$this', null] } } } } }, // 第五步:展开所有所有者,筛选匹配link且为作曲人类别的用户 { $unwind: '$all_owners' }, { $match: { $expr: { $in: ['$all_owners.link', '$target_links'] }, 'all_owners.category': 'CA', // 作曲人标识,可根据实际字段规则调整 'all_owners.codigo_ecad': { $ne: 5546730 } // 排除编辑器本身 } }, // 第六步:按codigo_ecad去重,获取唯一所有者 { $group: { _id: '$all_owners.codigo_ecad', owner_info: { $first: '$all_owners' } } }, // 第七步:调整输出格式 { $replaceRoot: { newRoot: '$owner_info' } }, // 可选:和原查询保持一致的排序分页规则 { $sort: { _id: -1 } }, { $limit: 100 } ])
上述查询会直接返回符合要求的唯一作曲人列表,和你示例期望的输出结构完全一致。
加分实现:关联owners集合获取完整数据
只需要在上述聚合管道的末尾追加$lookup阶段即可:
// 在上面的聚合管道最后添加如下阶段 { $lookup: { from: 'owners', // 要关联的集合名称 localField: 'codigo_ecad', // 当前查询结果中所有者的关联字段 foreignField: 'codigo_ecad', // owners集合的关联字段,可根据实际字段规则调整 as: 'full_owner_info' } }, // 可选:展开关联结果,调整输出结构 { $unwind: '$full_owner_info' }
说明
如果你的业务中作曲人标识不是CA,或者关联字段有差异,直接替换对应过滤条件即可,整体管道逻辑无需调整。
内容的提问来源于stack exchange,提问作者Guilherme Sampaio
相关产品推荐
相关产品推荐

