Mongoose:.populate on key with white space 不起作用

Posted

技术标签:

【中文标题】Mongoose:.populate on key with white space 不起作用【英文标题】:Moongose: .populate on key with white space doesn't work 【发布时间】:2021-04-15 21:57:04 【问题描述】:

我正在使用 Express 和 Mongoose 执行一些数据库操作。当尝试填充键包含空格的路径时,它基本上会被忽略。

MongoDB 模型:

const OrgCrimeSchema = new Schema(
  gracePeriod:  type: Date, default: Date.now() ,
  Technical: 
    description: String,
    difficulty: Number,
    owner:  type: Schema.Types.ObjectId, ref: 'User' ,
  ,
  'Social Engineering':  // This one causes issues
    description: String,
    difficulty: Number,
    owner:  type: Schema.Types.ObjectId, ref: 'User' ,
  ,
);

查找 + 填充:

const now = Date.now();
const allOrgCrimes = await OrgCrime.find( gracePeriod:  $lte: now  )
    .populate('Technical.owner', 'name')
    .populate('Social Engineering.owner', 'name');

console.log(allOrgCrimes['Social Engineering'][0].owner); 
//5fca3b4a86e77b5c8e58b683

console.log(allOrgCrimes['Technical'][0].owner); 
//  name: 'npc_alice', _id: 5fae6d7ee60018434108369c 

我假设路径没有被填充,因为键中有一个空格。我尝试了点符号和输入path: 'Social Engineering', select: 'name -id',但没有运气。

有什么办法可以不用重写架构结构吗?

【问题讨论】:

【参考方案1】:

简而言之,没有办法,如果我们想同时填充多条路径,有这种办法

例如

Story
.find(...)
.populate('book author') // space delimited path names
.exec()

您可以看到以空格分隔的路径名。

当你传递一个带空格的键时,猫鼬认为它是填充多个

【讨论】:

【参考方案2】:

正如 Mohammad Yaser Ahmadi 指出的那样,今天没有解决此问题的方法,因为 populate 假设您正在填充多个而不是尝试读取中间有空格的路径名。我如何“解决”这个问题是将模型重写为:

const OrgCrimeSchema = new Schema(
  gracePeriod:  type: Date, default: Date.now() ,
  roles: [
    role: String,
    description: String,
    difficulty: Number,
    owner:  type: Schema.Types.ObjectId, ref: 'User' ,
  ]
)

然后填充实际上变得更容易:

.populate('roles.owner', 'name')

【讨论】:

以上是关于Mongoose:.populate on key with white space 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

mongoose.populate() 未显示填充内容

19-3-18 mongoose 连表查询populate用法

Mongoose .populate 随机

mongoose 文档 Population

Mongoose .populate() 不填充

Model.populate() 不是 Mongoose 中的返回文档