如何在猫鼬中填充嵌套实体?
Posted
技术标签:
【中文标题】如何在猫鼬中填充嵌套实体?【英文标题】:How to populate nested entity in Mongoose? 【发布时间】:2019-01-16 17:01:45 【问题描述】:我有这样的模型:
const UserSchema = new mongoose.Schema(
name: String,
workspaces: [
workspace:
type: mongoose.Schema.ObjectId,
,
owner: Boolean
]
);
const WorkspaceSchema = new mongoose.Schema(
title: String,
description: String
);
我想像这样填充用户记录:
name: "John",
workspaces: [
workspace:
title: "First space",
description: "About space#1"
,
owner: true
,
workspace:
title: "Second space",
description: "About space#2"
,
owner: false
]
我尝试通过填充方法来做到这一点:
const user = await User
.findOne(query)
.populate(
path: 'workspaces',
populate:
path: 'workspace',
model: 'Workspace'
);
这是不正确的。我搜索了这样的案例,但没有找到类似的东西。所有其他示例都不包括像我的布尔“所有者”这样的属性。
【问题讨论】:
当然,我可以将owner
属性移动到Workspace模型中,参考User。但在我的实际情况下,我也有 permissions: read: Boolean, write: Boolean
与 owner
处于同一级别的属性@
使用 $push 和 $each docs.mongodb.com/v3.2/reference/operator/update/push/…。避免使用通常不使用现代功能的库,这些功能在未来将是原子的并且更高效。
【参考方案1】:
使用深度填充
安装:
npm i mongoose-deep-populate
用法:
var deepPopulate = require('mongoose-deep-populate')(mongoose);
User.deepPopulate(users, 'workspaces.workspace')
.then(function(err, data)
console.log(data);
);
阅读更多:https://www.npmjs.com/package/mongoose-deep-populate
希望这能解决您的问题。
【讨论】:
【参考方案2】:我建议您在用户架构声明中添加对工作区模型的引用:
workspace:
type: mongoose.Schema.ObjectId,
ref: "Workspace"
另外,您可能搞砸了填充方法,因为workspaces
数组本身不包含对外部对象的引用。
您可能应该像这样使用这种方法:
const user = await User
.findOne(query)
.populate("workspaces.workspace");
或者,如果您需要除路径之外的任何其他选项,请与选项对象一起使用:
const user = await User
.findOne(query)
.populate(
path: "workspaces.workspace", ...
);
【讨论】:
是的,这对我有用!但结果我得到了像下面这样的结构。注意“_id”道具。这很相似,但不一样!为什么会这样? 名称:“John”,工作区:[ 工作区: _id:“5b6c3a7d39606df14010fbc0”,标题:“第一个空间”,描述:“关于空间#1”,所有者:true,_id: "5b6c3a7d39606df14010fbc1" 那是因为 mongo 默认为嵌套集合创建 _id。您可以通过设置 _id: false 选项来禁用此行为。看看那里***.com/questions/17254008/…以上是关于如何在猫鼬中填充嵌套实体?的主要内容,如果未能解决你的问题,请参考以下文章