使用MongoDB聚合框架实现跨集合条件过滤文档并按规则排序
MongoDB聚合实现方案
你可以直接在collectionA上执行如下聚合查询,将代码中的<目标用户ID>替换为你要查询的具体userID即可:
db.collectiona.aggregate([ // 关联collectionB中匹配当前文档和目标用户的记录 { $lookup: { from: "collectionb", let: { a_id: "$_id" }, pipeline: [ { $match: { $expr: { $eq: ["$collectionaID", "$$a_id"] }, "data.userID": "<目标用户ID>" } }, { $project: { data: { $first: { $filter: { input: "$data", cond: { $eq: ["$$this.userID", "<目标用户ID>"] } } } } } } ], as: "b_match" } }, // 提取用户权限数据,计算文档是否符合保留规则 { $addFields: { user_data: { $first: "$b_match.data" }, should_keep: { $or: [ { $eq: [{ $size: "$b_match" }, 0] }, { $eq: ["$user_data.response", false] } ] } } }, // 过滤掉不符合要求的文档 { $match: { should_keep: true } }, // 按visibility排序:无关联记录/visibility为false在前,true在后 { $sort: { "user_data.visibility": 1 } }, // 仅返回collectionA的原始字段 { $project: { _id: 1, title: 1 } } ])
内容的提问来源于stack exchange,提问作者Prateek Banga
相关产品推荐
相关产品推荐

