我正在node.js,socket.io和mongoDB中构建消息传递系统。我对node.js和socket.io非常了解,但是我是mongoDB的新手。 这是我现在的猫鼬模式:
conversation_model.js:
const mongoose = require('mongoose');
const conversationSchema = new mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
name: String,
created_at: {type: Date, default: Date.now}
});
module.exports = mongoose.model('Conversation', conversationSchema);
,在message_model.js中,我有:
const mongoose = require('mongoose');
const messageSchema = new mongoose.Schema({
message: String,
conversation_id: String,
user_id: Number
});
module.exports = mongoose.model('Message', messageSchema);
我的对话是在单独的快速路由中创建的,有时在用户添加消息后,我会像这样保存新消息:
MessageModel.create(
{
conversation_id: data.conversation_id,
message: data.message,
user_id: data.user_id
}
).then((response) => {
callback(response);
}).catch(err => console.error(err));
该消息也保存在其相关集合中。 但是现在我想在猫鼬查找操作中检索对话及其所有消息。
我已经阅读了有关猫鼬填充的内容,并在会话模型中创建了消息引用,但是当我查询时,我没有在会话中添加消息。
这是我的查找电话:
ConversationModel.findById(conversation_id).populate('messages').then(conversationDetail => {
console.log(conversationDetail);
}).catch(err => console.error(err));
这是我更新后的对话模型,用于与对话查找操作一起获取消息:
const mongoose = require('mongoose');
const conversationSchema = new mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
name: String,
created_at: {type: Date, default: Date.now},
messages :[{type: mongoose.Schema.Types.ObjectId, ref: 'Message' }]
});
module.exports = mongoose.model('Conversation', conversationSchema);
但是它不起作用。对话查找操作的消息数组始终为空,即使存在与该对话相关的消息也是如此。
还请告诉我,在消息模型中保存session_id字段是个好主意吗? 谢谢
答案 0 :(得分:1)
您缺少消息模型上的反向链接。因此,如果您想在该集合中使用refs,那么您真的没有选择在其中放置session_id。可以将其视为类似于SQL中的外键关系。
conversation_id: String,
应为:
conversation_id: {type: mongoose.Schema.Types.ObjectId, ref: "Conversation", index: true}