Node.js 在Mongoose上存储模式的正确方法?
我开始学习一些NodeJ,以及如何从YouTube上的AcademicInd制作RESTAPI,并学习了什么是关系数据库和非关系数据库,等等 使用MongoDB时,写操作相当便宜,因此我希望尽量减少读操作的次数。目前,我正在尝试如何制作一个API,它将用于一个类似于discord的应用程序,尽管这是为了好玩 这是创建模式的正确方法吗Node.js 在Mongoose上存储模式的正确方法?,node.js,mongodb,mongoose,schema,Node.js,Mongodb,Mongoose,Schema,我开始学习一些NodeJ,以及如何从YouTube上的AcademicInd制作RESTAPI,并学习了什么是关系数据库和非关系数据库,等等 使用MongoDB时,写操作相当便宜,因此我希望尽量减少读操作的次数。目前,我正在尝试如何制作一个API,它将用于一个类似于discord的应用程序,尽管这是为了好玩 这是创建模式的正确方法吗 const mongoose = require('mongoose') const userSchema = mongoose.Schema({ _id
const mongoose = require('mongoose')
const userSchema = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
name: { type: String, required: true, unique: true},
email: { type: String, required: true },
password: { type: String, required: true }, // TODO: Hashing, etc
guilds: [{
_id: mongoose.Schema.Types.ObjectId,
name: {type: String, required: true},
channels: [{
_id: mongoose.Schema.Types.ObjectId,
name: {type: String, required: true},
// Only the X most recent messages
messages: [{
_id: mongoose.Schema.Types.ObjectId,
message: {type: String, required: true},
user: {
_id: mongoose.Schema.Types.ObjectId,
name: {type: String, required: true}
}
}]
}],
// Only an X amount of users
users: [{
_id: mongoose.Schema.Types.ObjectId,
name: {type: String, required: true}
}]
}]
})
module.exports = mongoose.model('User', userSchema)
然后是公会
const mongoose = require('mongoose')
const guildSchema = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
name: {type: String, required: true},
channels: [{
_id: mongoose.Schema.Types.ObjectId,
name: {type: String, required: true},
// Only an X amount of messages
messages: [{
_id: mongoose.Schema.Types.ObjectId,
message: {type: String, required: true},
user: {
_id: mongoose.Schema.Types.ObjectId,
name: {type: String, required: true}
}
}]
}],
// All the users
users: [{
_id: mongoose.Schema.Types.ObjectId,
name: {type: String, required: true}
}]
})
module.exports = mongoose.model('Guild', guildSchema)
通道模式
const mongoose = require('mongoose')
const channelSchema = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
name: { type: String, required: true },
guild: {
_id: mongoose.Schema.Types.ObjectId,
name: { type: String, required: true },
channels: [{
_id: mongoose.Schema.Types.ObjectId,
name: { type: String, required: true }
}],
// The users of the guild, or just the channel?
// Could add a users object outisde of the guild object
users: [{
_id: mongoose.Schema.Types.ObjectId,
name: { type: String, required: true }
}]
}
})
module.exports = mongoose.model('Channel', channelSchema)
最后是信息
const mongoose = require('mongoose')
const messageSchema = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
user: {
_id: mongoose.Schema.Types.ObjectId,
name: {type: String, required: true}
},
message: {type: String, required: true},
channel: {
guild: {
_id: mongoose.Schema.Types.ObjectId,
name: {type: String, required: true}
// Store more data for each message?
}
}
})
module.exports = mongoose.model('Message', messageSchema)
我不确定这是否是非关系模式的样子。如果不是,我将如何存储所需的数据
另外,假设我在公会Y的X频道上发布了一条消息,用户a、B和C,我将如何更新所有条目,添加消息
到目前为止,我只使用了User.find({u id:id}).exec().then().catch(),所以我不确定如何更新它们
提前谢谢 邮件的收集应独立进行,不要将其嵌入任何收集中。嵌入将无限增长的数据不是一个好主意 将最后5条消息存储到其他集合的想法看起来很难实现 当您必须更新行业协会、频道、行业协会用户时,将所有集合中的非规范化数据嵌入用户集合似乎是个问题 你可以将频道嵌入公会。渠道不会无限增长,应该是一个合理的数量,每个公会少于100个渠道,并且可能总是与他们所属的公会一起使用。如果不是,考虑不要嵌入<强>通道<强>到<强>行会< /强> mongodb的功能是构建反映应用程序如何使用数据的模式。我建议从标准化数据开始。当创建、读取、更新和删除数据出现问题时,请在mongoose模式中进行适当的更改以解决问题。从长远来看,过早的优化只会带来伤害 答案总是取决于细节。由于我不知道所有细节,我推荐MongoDB首席技术支持工程师William Zola撰写的一篇分为三部分的文章