首页 > 解决方案 > 从nodejs服务器的mongo文档中的子数组中删除项目

问题描述

下面是聊天应用程序的 nodejs 服务器的一部分代码和猫鼬模式。当用户发送消息时,消息将保存在两个文档中。一个在发送者中,另一个在接收者中。

在下面给出的 JS 代码中,我试图从发送者文档和接收者文档中删除发送者消息。删除发件人消息文档很简单: Message.findByIdAndDelete({_id:userID}).catch((err) => { console.log(err.message);});

至于删除接收者文档中的发件人项目,我设法找到了包含 senderID 的接收者文档,但是当我尝试从接收者文档中的用户列表中提取项目时,我收到以下异常:

node:events:353
      throw er; // Unhandled 'error' event
      ^
TypeError: user.pull is not a function

有关如何使其工作的任何建议?

完整的JS代码:

const deleteMessage = (userID) => {

  console.log('userID delete : ' +userID)
  //Delete message collection corresponding to the userID
  Message.findByIdAndDelete({_id:userID}).catch((err) => { console.log(err.message);});

    //Delete messages corresponding to the userID from the receiver' message list
  Message.find({users:{$elemMatch:{ _id:userID}}}, (err,doc)=>{
    console.log(doc);

    doc.forEach((user)=> {

      user.pull({_id:userID})
      doc.save();
    })
    
  }).catch((err) => {
    console.log(err.message);
  });
}

消息架构:

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const contentSchema = new Schema(
  {
    isMy: Boolean,
    message: String,
    createdAt: Date,
  }
);

const receiverSchema = new Schema({
  _id: String,
  messages: [contentSchema],
});

const messageSchema = new Schema({
  _id: String,
  users: [receiverSchema],
});

module.exports = mongoose.model("Message", messageSchema);

标签: node.jsmongoose

解决方案


您不能直接collection上使用pull ,假设user是您的收藏,您可以使用findOneAndUpdate,如下所示 -

user.findOneAndUpdate({_id: userId}, {    //here find that user
          $pull: {_id: userId}   //use your reference like message id or something
})

如果您想要更清楚,请告诉我。谢谢你。


推荐阅读