首页 > 解决方案 > 根据条件添加自定义字段并在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但是卡在了条件检查代码上。

任何帮助都会有很大帮助,谢谢。

标签: node.jsmongodb

解决方案


  • $lookup加入roles收藏
  • $matchidname等于AdminSuperAdmin
  • $project显示必填字段并创建字段IsSuperAdmin检查条件,如果角色nameSuperAdmin返回,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"
        ]
      }
    }
  }
])

操场


推荐阅读