You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法将修改后的对象保存回MongoDB数据库问题求助

问题解决:MongoDB中向数组添加ID后save失败

我通过Object Id找到Group对象,向它的arrayOfPlacemarkIds数组添加新ID的步骤能正常执行,但调用group.save()保存回MongoDB时返回错误。

业务逻辑代码

addPlacemarkToGroup: {
    handler: async function (request, h) {
        const loggedInUser = request.auth.credentials;
        const user = await db.userStore.getUserById(loggedInUser._id);

        const placemark = await db.placemarkStore.getPlacemarkById(request.payload.placemarkId);
        const group = await db.groupStore.getGroupById(request.payload.groupId);

        console.log(group);

        group.arrayOfPlacemarkIds.push(placemark._id);

        await group.save();

        console.log(group);

        return h.redirect("/dashboard");
    },
},

Schema定义

import Mongoose from "mongoose";
import { User } from "./user.js";
import { Placemark } from "./placemark.js";

const { Schema } = Mongoose;

const groupSchema = new Schema({
    title: String,
    userId: {
        type: Schema.Types.ObjectId,
        ref: "User",
    },
    arrayOfPlacemarkIds: [{type: [Schema.Types.ObjectId], ref:"Placemark"}]
});

export const Group = Mongoose.model("Group", groupSchema);

问题原因与修复

报错的核心原因是**arrayOfPlacemarkIds的Schema定义错误**——你把它定义成了「数组的数组」:[{type: [Schema.Types.ObjectId], ref:"Placemark"}],这意味着每个数组元素本身又是一个ObjectId数组,和你实际要存储单个Placemark ID的需求不匹配。

修改Schema定义为普通的ObjectId数组即可:

arrayOfPlacemarkIds: [{ 
    type: Schema.Types.ObjectId, 
    ref:"Placemark"
}]

修改后重新运行代码,group.save()就能正常执行。

另外,也可以直接用Mongoose的$push操作符在数据库层面完成更新,省去先查询再保存的步骤,效率更高:

// 替换原有的查询+push+save逻辑
await db.groupStore.updateOne(
    { _id: request.payload.groupId },
    { $push: { arrayOfPlacemarkIds: placemark._id } }
);

内容的提问来源于stack exchange,提问作者Florian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 20:40:01