首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Mongoose填充子文档时的不良结构

使用Mongoose填充子文档时的不良结构
EN

Stack Overflow用户
提问于 2018-01-06 21:24:23
回答 2查看 368关注 0票数 0

用户有项目I,但我还想存储一些额外的项目信息:

代码语言:javascript
运行
复制
const userSchema = new Schema({
...
  projects: [{
    _id: {
      type: Schema.Types.ObjectId,
      ref: 'Project',
      unique: true, // needed?
    },
    selectedLanguage: String,
  }]
});

我想用项目名来填充,所以我这样做:

代码语言:javascript
运行
复制
const user = await User
  .findById(req.user.id, 'projects')
  .populate('projects._id', 'name')
  .exec();

然而,user.projects给了我这个不想要的输出:

代码语言:javascript
运行
复制
[
  {
    selectedLanguage: 'en',
    _id: { name: 'ProjectName', _id: 5a50ccde03c2d1f5a07e0ff3 }
  }
]

我想要的是:

代码语言:javascript
运行
复制
[
  { name: 'ProjectName', _id: 5a50ccde03c2d1f5a07e0ff3, selectedLanguage: 'en' }
]

我可以转换数据,但我希望Mongoose可以实现这一点,因为这似乎是一个常见的场景?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-07 02:39:09

这里似乎有两个选项:

1)将_id字段命名为更具语义的名称,这样它就是:

代码语言:javascript
运行
复制
{
  selectedLanguage: 'en',
  somethingSemantic: { _id: x, name: 'ProjectName' },
}

2)扁平化数据,这通常可以用现代JS来完成:

代码语言:javascript
运行
复制
const user = await User
  .findById(req.user.id, 'projects')
  .populate('projects._id', 'name')
  .lean() // Important to use .lean() or you get mongoose props spread in
  .exec();

const projects = user.projects.map(({ _id, ...other }) => ({
  ..._id,
  ...other,
}));
票数 1
EN

Stack Overflow用户

发布于 2018-01-06 22:25:21

试试下面这样的populate({path:'projects', select:'name selectedLanguage'})

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48127786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档