node.js - 从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);
解决方案
您不能直接在collection上使用pull ,假设user是您的收藏,您可以使用findOneAndUpdate,如下所示 -
user.findOneAndUpdate({_id: userId}, { //here find that user
$pull: {_id: userId} //use your reference like message id or something
})
如果您想要更清楚,请告诉我。谢谢你。
推荐阅读
- python - 您使用哪个版本的 fbs、PySide2、shiboken2 和 python 来分发 Qt for Python 项目?
- c# - ASP.NET 4.0 图表控件损坏的图像链接
- microsoft-graph-api - Microsoft Graph API Beta - 获取聊天返回 401 Unauthorized
- apache2 - VirtualHost Apache2 似乎被忽略了——尽管 DNS 传播,只有我的本地主机文件才能正常工作
- html - 无法让文字出现在图像下方
- javascript - 将属性添加到在 jQuery 中,每个循环仅在第一次通过时?
- ios - iOS 13 导航栏大标题问题
- .net - 如何加载像“ms-resource:///Files/somefile.svg”这样的URI?
- c++ - macOS 上的 wxWidgets 暗模式
- android - 在 android visuel studio 3.5.2 上构建和运行 odk collect 失败