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 分配到数组中的主要内容,如果未能解决你的问题,请参考以下文章

利用Mongoose来结构化模式与验证

针对 Mongoose 模式验证对象而不保存为新文档

Node.js Mongoose 如何保存新文档并向数组字段添加新值

Mongoose/Mongo:更新不保存

使用`let cached = global.mongoose`时出现Next.js + Typescript + mongoose错误

创建新模式对象后,Mongoose 引用的字段丢失