MongoDB $or查询:如何在返回结果中标记账号身份(所有者/协作者)
为MongoDB查询结果添加账号角色标识
你可以通过两种方式实现给返回的accountId添加角色标识(所有者/协作者),以下是具体方案:
方案一:使用MongoDB聚合框架(推荐)
聚合框架直接在数据库层面完成字段计算,能减少应用层的数据处理压力,效率更高。代码示例:
const selectAccounts = await account.aggregate([ // 匹配符合条件的账号 { $match: { $or: [ { owner: { $eq: credentials } }, { collaborators: { $in: [credentials] } } ] } }, // 添加角色标识字段 { $addFields: { role: { $cond: { if: { $eq: ["$owner", credentials] }, then: "owner", else: "collaborator" } } } }, // 只保留需要的字段 { $project: { accountId: 1, role: 1, _id: 0 // 不需要_id可省略 } } ]).exec();
逻辑说明:
- 先用
$match过滤出用户作为所有者或协作者的账号; - 通过
$addFields和$cond判断:如果当前文档的owner等于目标用户,标记为owner,否则必然是协作者(已通过$match筛选),标记为collaborator; - 最后用
$project只保留accountId和role字段。
方案二:查询后在应用层处理
如果不想使用聚合,也可以先查询额外的判断字段,再在应用层通过JavaScript处理:
// 先查询需要的字段(owner用于判断角色) const rawAccounts = await account .find({ $or: [ { owner: { $eq: credentials } }, { collaborators: { $in: [credentials] } } ] }) .select("accountId owner") .exec(); // 遍历结果添加角色标识 const selectAccounts = rawAccounts.map(doc => ({ accountId: doc.accountId, role: doc.owner === credentials ? "owner" : "collaborator" }));
这种方式的缺点是需要从数据库传输额外的owner字段到应用层,数据量较大时不如聚合方案高效。
内容的提问来源于stack exchange,提问作者Sam Leurs
相关产品推荐
相关产品推荐

