node.js - 根据条件添加自定义字段并在nodeJs中返回一个新集合
问题描述
我是 nodejs 的新手,目前我被一个查询困住了。我有收藏用户和角色。下面是相同的结构。
用户:
{"_id":ObjectId("59ba9b1ey4d6h00012345abe")},
"email":"abc@gmail.com",
"name":"Jane",
"roles":[{"$oid":"1234567af6a8e8901ef9c111"}]}
{"_id":ObjectId("60ba9b1ey4d6h00012345abe")},
"email":"pqr@gmail.com",
"name":"Derek",
"roles":[{"$oid":"1111111af6a8e8901ef9c111"}]}
{"_id":ObjectId("60ba9b1ey4d6h00012345abe")},
"email":"xyz@gmail.com",
"name":"John",
"roles":[{"$oid":"1010101af6a8e8901ef9c111"}]}
角色:
{"_id":ObjectId("1234567af6a8e8901ef9c111")},
"name":"Admin"}
{"_id":ObjectId("1111111af6a8e8901ef9c111")},
"name":"User"}
{"_id":ObjectId("1010101af6a8e8901ef9c111")},
"name":"SuperAdmin"}
现在在 NodeJs 中,我想检索角色名称为“Admin”和“SuperAdmin”的所有用户,并添加一个新字段“IsSuperAdmin”,如果它在角色 Super Admin 中,则值为“Yes”。
所以输出应该是:
[{name:"John",IsSuperAdmin:"YES"},
{name:"Jane",IsSuperAdmin:"NO"}]
我尝试在下面检索具有所需角色的用户:
const Admin= await Role.find({$or: [{ name: 'Admin'}, { name: 'SuperAdmin'}]})
const user=await User.find({ roles: {$in: Admin.map(r => r._id)} }).populate('roles').sort('email');
但是,我不确定如何继续添加这个新字段,我尝试了一下$aggregate
,$addfields
但是卡在了条件检查代码上。
任何帮助都会有很大帮助,谢谢。
解决方案
$lookup
加入roles
收藏$match
idname
等于Admin
或SuperAdmin
$project
显示必填字段并创建字段IsSuperAdmin
检查条件,如果角色name
则SuperAdmin
返回,YES
否则NO
const users = await User.aggregate([
{
$lookup: {
from: "role", // replace your original collection name
localField: "roles",
foreignField: "_id",
as: "roles"
}
},
{
$match: {
"roles.name": {
$in: ["Admin", "SuperAdmin"]
}
}
},
{
$project: {
_id: 0,
name: 1,
IsSuperAdmin: {
$cond: [
{ $eq: ["$roles.name", ["SuperAdmin"]] },
"YES",
"NO"
]
}
}
}
])
推荐阅读
- c# - 来自开放 API 的 .Net Parser JSON
- python - 尝试允许用户按箭头键移动图像时,如何修复“int”对象没有属性“移动”错误?
- discord - OpenGraph 嵌入与 express&ejs 的不一致
- python - 如何从列表中只提取英文单词?
- angular - 如何在运行时通过 NgxMatDateFormats 格式化日期和时间
- python - 如何创建类实例并在一个字符串中运行它的方法?Python
- java - Oracle BI Publisher Java API 将中文字符转换为问号 (?)
- flutter - 注册 Flutter 时保存用户 ID
- python - 如何使用赛璐珞绘制多条线的时间序列?(Python)
- java - 我通过 Eclipse HSQL 数据库管理器与 HSQL 数据库的连接不起作用