Next JS / mongoose:在保存新对象之前将 ObjectId 分配到数组中
Posted
技术标签:
【中文标题】Next JS / mongoose:在保存新对象之前将 ObjectId 分配到数组中【英文标题】:Next JS / mongoose: Assign ObjectId's into array before saving new object 【发布时间】:2021-12-14 11:20:00 【问题描述】:我正在尝试创建一个包含所选 objectId(用户)的新对象(组)。从现在开始我就头疼了,但我找不到正确的方法。 组模型如下所示:
import mongoose from 'mongoose';
const groupSchema = new mongoose.Schema(
creator:
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
required: true,
,
title: type: String ,
members: [
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
,
],
,
timestamps: true,
);
const Group =
mongoose.models.Group || mongoose.model('Group', groupSchema);
export default Group;
这是用户模型:
import mongoose from 'mongoose';
const userSchema = new mongoose.Schema(
name: type: String ,
,
timestamps: true,
);
const User =
mongoose.models.User || mongoose.model('User', userSchema);
export default User;
所以我希望用户能够创建组,从列表中选择现有用户并将它们添加到成员数组中。 我了解如何通过 findAndUpdate 创建组并分配用户并使用填充查询它们,但我真的不明白如何在创建组之前将用户 ObjectId 添加到数组中。有人能给我建议如何为这种情况进行后期操作吗?
这是我目前的post操作,当然不行。
import nc from 'next-connect';
import db from '../../../utils/db';
const handler = nc();
//create group
handler.post(async (req, res) =>
await db.connect();
const user = await User.findById(req.params.id);
const newGroup = new Group(
creator: req.user._id,
title: req.body.title,
members: [
item: user,
],
);
const group = await newGroup.save();
await db.disconnect();
res.send( message: 'Group created', group );
);
export default handler;
谢谢你帮助我!!
【问题讨论】:
【参考方案1】:您的模型看起来不错,正如您定义的那样
members: [
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
,
],
您可以将 objectIds 保存为数组,并在查询时分配 populate 方法,该方法将根据 objectId 自动填充用户。
因此,为了保存组成员,请尝试像这样更新您的保存方法
handler.post(async (req, res) =>
await db.connect();
// you can remove this query
// const user = await User.findById(req.params.id);
const newGroup = new Group(
creator: req.user._id,
title: req.body.title,
// array of objectIds (user ids)
members: [req.params.id],
);
const group = await newGroup.save();
await db.disconnect();
res.send( message: 'Group created', group );
);
为了获取群组成员,您可以在查询群组时添加填充方法
Group.find().populate('members') // the ref field name in Group model
【讨论】:
感谢您抽出宝贵时间回答我的问题。通过使用您的解决方案,我收到错误“无法读取未定义的属性 'id'”。你知道如何解决这个问题吗? 错误是关于req.params.id
?如果是,那么我说的是您需要保存在成员数组中的用户 ID
我试图通过 Postman 像这样(body/JSON)创建组:`` "name": "Group 1", "notice": "group notice", "members": [ "616863baa9d229daa5ffdbab"] ``` 所以我已经在数组中传递了值
看起来不错,然后尝试在处理程序中将members: [req.params.id]
更改为members: req.body.members
很好,非常感谢您的帮助:)以上是关于Next JS / mongoose:在保存新对象之前将 ObjectId 分配到数组中的主要内容,如果未能解决你的问题,请参考以下文章
Node.js Mongoose 如何保存新文档并向数组字段添加新值
使用`let cached = global.mongoose`时出现Next.js + Typescript + mongoose错误