用猫鼬保存和检索相关数据

时间:2019-01-12 14:28:03

标签: node.js mongodb mongoose nosql

我正在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字段是个好主意吗? 谢谢

1 个答案:

答案 0 :(得分:1)

您缺少消息模型上的反向链接。因此,如果您想在该集合中使用refs,那么您真的没有选择在其中放置session_id。可以将其视为类似于SQL中的外键关系。

conversation_id: String,

应为:

conversation_id: {type: mongoose.Schema.Types.ObjectId, ref: "Conversation", index: true}