【问题标题】:Correct structure of a new MERN-project新 MERN 项目的正确结构
【发布时间】:2020-04-24 02:56:31
【问题描述】:

我决定帮助我朋友为他的新公司建立一个网站,我认为现在是试用 MERN 堆栈(mongodb、express、react 和 node.js)的好时机。

但我又在考虑 MongoDB,以及它是否真的适合这个项目,因为会有关系数据。

将存在的关系数据是客户及其对象。假设客户进行了注册,并且对于每个客户,公司都会以某种方式使用一辆或几辆汽车。

这在 MongoDB 中可行吗?您将如何以最佳方式构建它?我正在考虑用户集合,将对象(汽车)作为用户集合中的对象数组字段。

我之前没有在 MERN 做过项目,我愿意接受任何建议。

另外,我对有一个“导师”非常感兴趣,我什至可以接受某种形式的报酬,让某人指导我完成这个项目。我希望这不违反这里的规则,如果是,对不起。

谢谢。

【问题讨论】:

  • 当你说会有relational data时,你不应该首先考虑SQL吗? MongoDB 确实通过ref 支持关系数据。如果您能更具体地说明您将拥有哪些数据,我可以详细说明。
  • 是的,这就是我在这里问的原因,因为也许 MERN 不是处理这个项目的最佳方式。但很遗憾,因为我现在真的很想尝试 MERN-combo。这个想法有点像airbnb。客户注册,客户也会向商家注册一个或多个对象。所以主要是我们的客户和他们的(1个或几个)对象之间的关系。通常它只是一个对象,但可能更多,很少超过 5-10 个。
  • 您将拥有什么类型的数据?我们不能仅仅根据会有一些关系数据的信息来判断这是否是一个好方法。时期。我们需要更多信息。
  • 关系数据只是注册的客户。每个客户都将提供一个或几个住房对象。所以关系数据是客户和他们的住房对象。我不知道还能告诉你什么,仅此而已。
  • 那么 MongoDB 肯定可以处理的。

标签: reactjs mongodb mern


【解决方案1】:

为了在 MongoDB 中处理关系数据,您必须利用 DBrefs 功能。

我直接从我的一个生产项目中拿这些例子。

架构被严重截断,但仍讲述了 DBrefs 功能的故事。

它由两个模式组成:活动和用户

活动架构在这里:

/*eslint-env node*/

//Dependencies
const mongoose = require('mongoose');

//Global Constant
const Schema = mongoose.Schema;

// Create Schema
const ActivitySchema = new Schema({
    activity: {
        type: String,

    },

    description: {
        type: String,

    },
    intensity: {
        type: String,
    },
    hostId: {
        type: Schema.Types.ObjectId,
        ref: 'user'

    },

}, {
    collection: 'Activity'
});

mongoose.model('activity', ActivitySchema);

用户架构在这里:

/*eslint-env node*/

//Dependencies
const mongoose = require('mongoose');

//Global Constant
const Schema = mongoose.Schema;

//Create Schema
const UserSchema = new Schema({
    name: {
        type: String,

    },
    nickName: {
        type: String

    },
    email: {
        type: String,

    },
    password: {
        type: String,
    },
    profImage: {
        type: String,

    },
    interests: {
        type: Array,

    },

}, {
    collection: 'User'
});

mongoose.model('user', UserSchema);

如您所见,在活动架构的末尾有一个名为 hostId 的字段,其类型为 Schema.Types.ObjectId 和一个指向用户架构的 ref: 字段。

它本质上是通过将用户的ObjectId 存储在活动集合(在 SQL 中称为表)中来将两个文档虚拟链接在一起。

只有当且仅当查询函数(例如,.findOne().populate() 聚合运算符一起调用时,这两个文档才真正链接在一起。

例子:

//Syntax: database.collection.queryFunction

//Normal Query:

db.activity.findOne({activity:'stack overflow event`})

.then(activityData=>{

console.log(activityData);

//You will get something like this:

[
    {
        activity: 'stack overflow event',
        description: 'It's all about SO',
        intensity: 'Very chill',
        hostId: ObjectId(5ea1e3c89dcab6c27d1eb891),
    }
]



})
.catch(err=>console.log(err))


//When you use .populate()

db.activity.findOne({activity:'stack overflow event`})
.populate('user')
.then(activityData=>{

console.log(activityData);

//You will get something like this:

[
    {
        activity: 'stack overflow event',
        description: 'It's all about SO',
        intensity: 'Very chill',
    //The hostId field will get populate with the user object
        hostId: {
            name: 'SO Test User',
            nickName: 'soTest',
            email: 'xxx@xxx.com',
            ....it continues

        }
    }
]


})
.catch(err=>console.log(err))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-06
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多