我目前正在使用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}
答案 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!' });
});
});