【问题标题】:not return populate value in nodejs and mongo不在nodejs和mongo中返回填充值
【发布时间】:2020-07-05 17:14:09
【问题描述】:

我有两个collection

A:Manager

 const ManagerSchema = Schema({
  name: { type: String, require: true },
  family: { type: String, require: true },
  userName: { type: String, require: true },
  phoneNumber: { type: String, require: true },
  password: { type: String, require: true },
  isAdmin: { type: Boolean, require: true, default: true },
  isDelete: { type: Boolean, default: false },
  isActive: { type: Boolean, default: false },
  avatar: { type: String, default: null },
  scurityStamp: { type: String },
  locked: { type: Boolean, default: false },
  lockedDate: { type: Date, default: null },
  accountFail: { type: Number, default: 0 },
});

ManagerSchema.virtual('userRole',{
  ref : 'UserRole',
  localField : 'userRole',
  foreignField : 'user'
})

乙:UserRole

const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const UserRoleSchema = Schema({
  role: { type: Schema.Types.ObjectId, ref:'Roles' },
  user: { type: Schema.Types.ObjectId, ref:'Managers'}
});

module.exports = mongoose.model("UserRole", UserRoleSchema);

现在我需要向用户返回 UserRole 信息。我写了这段代码:

let auth=await Manager.findOne({userName:req.body.userName}).populate('userRole').exec();

但它不返回UserRole信息:

"isAdmin": true,
    "isDelete": false,
    "isActive": true,
    "avatar": null,
    "locked": false,
    "lockedDate": null,
    "accountFail": 0,
    "_id": "5f01dfc32714600aa8aa41bc",
    "name": "کیانوش",
    "family": "درتاج",
    "password": "$2b$15$WUgWTWuO/frlzWaGsfAHD.Jhp6ecqzL8Sr4g02B.XPceluXtJv0Z6",
    "phoneNumber": "0900018500ب98یdf0710bh06016",
    "userName": "kiadب0r0890037یh00f0072",
    "scurityStamp": "3db582c74dccbc628338bc8bcf62d405",

如何返回用户角色信息????

【问题讨论】:

  • @RameshReddy 是的,它不起作用
  • 您的ManagerSchema 没有名为userRole 的本地字段。
  • @RameshReddyi 创建一个虚拟字段
  • 您正在创建一个虚拟字段,但我认为您不能使用与 localField 相同的字段。
  • @RameshReddy 我该如何解决这个问题?

标签: javascript node.js mongoose


【解决方案1】:

首先,如果您不需要使用'virtual',则只需正常声明一个字段即可。

但在您的情况下,您需要指出一个现有/声明的localField,它与您在foreignField 中指向的字段类型相匹配,我认为它是role 而不是user

const ManagerSchema = Schema({
  name: { type: String, require: true },
  family: { type: String, require: true },
  userName: { type: String, require: true },
  phoneNumber: { type: String, require: true },
  password: { type: String, require: true },
  isAdmin: { type: Boolean, require: true, default: true },
  isDelete: { type: Boolean, default: false },
  isActive: { type: Boolean, default: false },
  avatar: { type: String, default: null },
  scurityStamp: { type: String },
  locked: { type: Boolean, default: false },
  lockedDate: { type: Date, default: null },
  accountFail: { type: Number, default: 0 },
  role:{type: Object}
});

ManagerSchema.virtual('userRole',{
  ref : 'UserRole',
  localField : 'role',
  foreignField : 'role' // should match with the localField type
})

【讨论】:

  • 如何在输出中选择客户字段?
  • 我想返回userRole字段_id
  • 你可以做.populate('userRole','_id')
  • 我使用嵌套填充 let auth = await Manager.findOne({ userName: userName }).populate({ path: "userRole", model:'UserRole', populate:{ path:'role', model:'Roles' } }).select('_id scurityStamp userRole._id');
  • 您是要获取userRole 集合中文档的_id 还是填充到“userRole”集合中的角色文档的_id?
猜你喜欢
  • 2014-11-20
  • 1970-01-01
  • 2020-04-08
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 2016-04-21
相关资源
最近更新 更多