【发布时间】:2016-02-29 05:05:25
【问题描述】:
我有一个相对简单的问题,但是,我一次又一次地陷入困境。我认为这是我第四次尝试重新构建文档以尝试获得所需的结果。
我想在 mongoose 中创建一个具有以下结构的数据库:
一个用户有很多组、帖子和cmets。 groups、posts 和 cmets 都属于一个 User。 post 可以属于多个组,也可以不属于任何一个。并且评论属于某个post。
这是我目前所拥有的:
用户架构
var userSchema = mongoose.Schema({
local : {
email : String,
password : String,
username : String,
created: {type:Date, default: Date.now}
}
});
后架构
var PostSchema = new Schema({
url: String,
highlighted: String,
comment: String,
image: String,
timeStamp: String,
description: String,
title: String,
created: {type:Date, default: Date.now},
private: Boolean,
favorite: Boolean,
readlater: Boolean,
postedBy: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
},
comments: [{
text: String,
postedBy: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
}
}],
groups: [{
name: String,
postedBy: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
}
}]
});
组架构
var GroupSchema = Schema({
name : String,
created: {type:Date, default: Date.now},
postedBy: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
}
});
虽然我在这个假设上可能是错误的,但我认为我已经按照应有的方式向用户发布帖子和评论发布关系。如果我错了,请纠正我。我现在遇到的主要问题是与我的小组发布关系。目前,根本没有任何关系。据我所知,这几乎就像该组属于该职位,而不是相反。我能想到的唯一另一种构建小组的方式是这样的:
var GroupSchema = Schema({
name : String,
created: {type:Date, default: Date.now},
postedBy: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
},
posts: [{
title: String,
Url: String,
comments: [{
text: String
}]
etc....
}]
});
我可以在上面的结构中看到的唯一问题是帖子必须是组的一部分,我希望它是可选的。据我所知,这也行不通。
如果您可以就如何构建它提供任何建议,这将对我有很大帮助。
提前谢谢你。
【问题讨论】:
-
我认为你被卡住了,因为 mongo(或扩展名 mongoose)都没有提供简洁表达关系数据的能力。你有什么理由不使用关系数据库?
-
嗨@Jonah。我正在使用 mongoDb/mongoose,因为我正在尝试学习平均堆栈。关于关系,我很肯定实际上可以使用 DBrefs 做我要求的事情,还是我错了?
-
您正在构建您的数据,就好像它是关系的一样 - 您是否考虑过在帖子中嵌入组和 cmets?您有 16MB 的空间。
-
@JonahWilliams 是的,我有,这是我目前倾向于的。我主要关心的是我以后如何引用它。我想提取某个组内的所有帖子,并通过将组嵌入帖子中,我正在努力研究如何进行该数据库调用。您能否就此提供见解?
-
@JoshuaL.:DBRef 只是美化的对象 ID。它们不以任何方式促进查询。当对象可以在同一字段中引用不同类型的对象时,它们很有用(例如帖子有内容,并且该内容可以是视频、图像、文本等)。据我从上面的架构中可以看出,你不需要那个。
标签: javascript node.js mongodb mongoose mongoose-populate