The Worker 2023-07-21 01:58 采纳率: 57.1%
浏览 53
已结题

Mongoose 向数组中插入数据失败

我有两个集合,一个是用户集合,一个是习惯集合。
每个用户都有一个属性habbits (本意是想写习惯habits,结果打错了,代码太庞大改不过来)
我把habbits定义为一个数组,具体定义如下:

    habbits:{
        type: [mongoose.Schema.Types.ObjectId],
        default: [null],
        ref: 'Habbit',
        required:false
    },

我希望每个习惯被创建时,相对应的用户habbits数组里添加这个习惯的id,用以记录用户都有哪些习惯。
我想将习惯的_id查询出来,并放进User集合里的该用户的habbits属性的数组里。

            // 查询生成的这个习惯的ID
            let thisHabbitID = await Habbit.find({habbitName:fields.taskName,executor:fields.executor}).select('_id');
            await User.updateOne({ id: fields.executor }, { $push: { habbits: thisHabbitID } });

目前测试过,习惯ID可以成功查出来并赋值到 thisHabbitID 这个变量中。
但当我尝试把它放进数组里时,它总是没有任何作用。

img

请问我该怎么办呢?

  • 写回答

4条回答 默认 最新

  • isjiff 2023-07-21 08:51
    关注

    根据你提供的代码和描述,看起来你使用了Mongoose来操作MongoDB数据库。你想将习惯的ID添加到用户集合中的habbits数组中。

    从你的代码来看,问题可能出在以下几个地方:

    在User模型中,你定义了habbits为一个数组类型,并设置了默认值为[null]。这可能导致在插入数据时遇到问题。可以尝试将默认值改为[]来表示一个空数组。

    在更新用户集合时,你使用了updateOne方法。注意,该方法返回的是一个WriteResult对象,而不是实际更新后的文档。你可以尝试使用findOneAndUpdate方法,它返回更新后的文档。

    修改后的代码如下所示:

    javascript
    let thisHabbitID = await Habbit.findOne({ habbitName: fields.taskName, executor: fields.executor }).select('_id');
    await User.findOneAndUpdate({ id: fields.executor }, { $push: { habbits: thisHabbitID._id } });
    这里使用了findOneAndUpdate方法将习惯的ID添加到habbits数组中,使用了thisHabbitID._id来获取具体的ID。

    在你的代码中,thisHabbitID 是一个数组,而 $push 操作符期望的是一个单个的值,而不是一个数组。所以,当你尝试将 thisHabbitID 数组放入到 habbits 数组中时,它并不会生效。

    解决这个问题的一种方法是使用索引访问 thisHabbitID 的第一个元素,即 thisHabbitID[0]。这样你就可以将习惯 ID 的单个值插入到 habbits 数组中了。以下是修正后的代码:

    javascript
    // 查询生成的这个习惯的ID
    let thisHabbitID = await Habbit.find({habbitName:fields.taskName,executor:fields.executor}).select('_id');
    await User.updateOne({ id: fields.executor }, { $push: { habbits: thisHabbitID[0] } });
    通过上述更改,你将会向 habbits 数组中插入习惯的 ID。

    另外,请确保executor字段的值正确匹配用户集合中的记录,以确保更新操作能正确进行。

    希望以上信息对你有所帮助!如果还有其他问题,请随时提问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 7月29日
  • 已采纳回答 7月21日
  • 创建了问题 7月21日