具有数组逻辑的Mongoose模型

时间:2016-03-13 14:15:10

标签: arrays node.js mongodb express mongoose

我目前正在使用Mongoose进行培训,为此我正在构建一个小消息应用程序。

我有一个用户集合,这里是 User.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var UserSchema = new Schema({
  username: String,
  password: String
});

module.exports = mongoose.model('User', UserSchema);

现在我想写一个应该包含用户列表的聊天室模型,我该怎么办?这是我目前的 Chatroom.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var ChatroomSchema = new Schema({
  name: String,
  password: String,
  members: ???
});

module.exports = mongoose.model('Chatroom', ChatroomSchema);

最后,我想知道如何在创建聊天室时在该成员数组中发布用户,这是 / chatroom 的路由代码:

router.route('/chatroom')
.post(function(req, res) {
  var chatroom = new Chatroom();
  chatroom.name = req.body.name;
  chatroom.password = encrypt(req.body.password,chatroom.name);
  chatroom.members = ???;

  chatroom.save(function(err) {
    if (err)
      res.send(err);

    res.json({ message: 'Chatroom created!' });
  });
});

是否有将用户绑定到members数组的特定方法,或者我应该将成员定义为字符串数组:

members : {username:String}

2 个答案:

答案 0 :(得分:0)

尝试使用参考文档

<强> Chatroom.js

var ChatroomSchema = new Schema({
  name: String,
  password: String,
  members: [Schema.Types.ObjectID, ref = 'user']
});

<强>控制器

router.route('/chatroom')
.post(function(req, res) {
  var chatroom = new Chatroom();
  chatroom.name = req.body.name;
  chatroom.password = encrypt(req.body.password,chatroom.name);
  chatroom.members = req.user; // if the user is authenticated

  chatroom.save(function(err) {
    if (err)
      res.send(err);

    res.json({ message: 'Chatroom created!' });
  });
});

答案 1 :(得分:0)

在您的情况下,人口将是理想的。来自 docs

  

人口是自动替换指定的过程   文档中包含来自其他集合的文档的路径。

人口将无缝地帮助您将Users集合中的数据导入您的Chatroom模型。请考虑以下示例来说明此方法:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var ChatroomSchema = new Schema({
    name: String,
    password: String,
    members: [{ type: Schema.Types.ObjectId, ref: 'User' }]
});

module.exports = mongoose.model('Chatroom', ChatroomSchema);

在聊天室模式定义中,通过将方括号中的字段定义_id括起来,为每个对象添加一个主要代理键列表,称为ObjectId,在数据中引用为members以获取此值功能。这些将是用于引用User集合中的文档的键。

注意: - 定义引用时,ref属性必须与模型定义中的模型名称完全匹配,否则您将收到错误(假设您引用非现有的Member模型或Users

MissingSchemaError: Schema hasn't been registered for model "Member"..

阅读数据

这是Mongoose人口通过其 populate() 功能显示文件阅读非常简单的简单快捷的地方。例如,要在聊天室中显示引用的users,请使用字符串中该字段的名称作为参数调用 populate() 方法,例如

Chatroom.findOne({"_id": chatId})
    .populate("members")
    .exec(err, chats) { ... }

撰写数据

保存Chatroom模型的数据时,还需要将引用保存到用户。例如,当创建新的Chatroom时,您需要将User个引用数组保存为成员字段:

router.route('/chatroom')
.post(function(req, res) {
    var chatroom = new Chatroom();
    var usersIds = ["54b5659536cd5250a3a93bd3", "54b5659836cd5250a3a93bd4"]; // <-- an array with members ids, for example.
    chatroom.name = req.body.name;
    chatroom.password = encrypt(req.body.password,chatroom.name);
    chatroom.members = usersIds; 

    chatroom.save(function(err) {
        if (err)
            res.send(err);
        res.json({ message: 'Chatroom created!' });
    });
});