在Mongoose上存储架构的正确方法是什么?

时间:2018-08-19 12:35:53

标签: node.js mongodb mongoose schema

我开始学习一些NodeJS,以及如何在YouTube上从Academind制作REST API,并了解了什么是关系数据库和非关系数据库,等等。

使用MongoDB,写操作相当便宜,因此我想尽量减少读取次数。目前,我试图看看如何制作一个API,该API将用于与discord相似的应用,尽管这会很有趣。

这是制作架构的正确方法吗?

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) 

我不确定这是否是非关系模式。如果不是,我将如何存储所需的数据?

也可以说,我与用户A B和C在行会Y的X通道上发布了一条消息,我将如何更新所有条目并添加一条消息?

到目前为止,我只使用了User.find({_ id:id})。exec()。then()。catch(),所以我不确定如何去更新它们。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

消息集合应独立存在,请勿将其嵌入任何集合中。嵌入将无限增长的数据不是一个好主意。

将最后5条消息存储到其他集合中的想法很难实现。

当必须更新行会渠道时,将所有集合中的

嵌入到所有非正常数据中的数据归为 users 似乎是一个问题。 >公会用户

您可以将渠道嵌入公会。渠道不会无限制地增长,应该是一个合理的数量,每个公会少于100个渠道,并且可能一直与它们所属的公会一起使用。如果没有,请考虑不要将渠道嵌入行会

mongodb的功能是构建反映应用程序如何使用数据的架构。我建议从规范化数据开始。当创建,读取,更新,删除数据出现问题时,请对猫鼬模式进行适当的更改以解决该问题。从长远来看,过早的优化只会带来伤害。

一如既往,答案取决于细节。由于我不了解所有详细信息,因此我推荐MongoDB首席技术支持工程师William Zola撰写的三部分文章。 part 1 part 2 part 3