【问题标题】:MongoDB - Mongoose: document structure/architectureMongoDB - Mongoose:文档结构/架构
【发布时间】: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


【解决方案1】:

您最好的选择是将您的群组和评论架构嵌入到您的帖子文档中。例如,

var GroupSchema = Schema({
    name: String, 
    created: { type:Date, default: Date.now },
});

var CommentSchema = Schema({
    text: String,
    postedBy: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    }
});


var PostSchema = new Schema({
    url: String,
    ...,
    postedBy: {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'User'
    },
    comments: [CommentSchema] 
    groups: [GroupSchema]
});

现在,如果您要查找特定组的帖子,您可以按如下方式构建查询。但是,您可以构建比这更复杂的查询。

Post.elemMatch("groups", {name: {$in: ["group1", "group2"]}}).then(...)

【讨论】:

  • 您好,非常感谢您的回答。我确实有一个后续问题。拉取所有组的列表时查询的外观如何?这需要是多个帖子中属于特定用户的所有唯一组的列表。
  • 如果这是更常见的查询,我建议也将组嵌入用户中。尽管看起来是不必要的重复,但文档数据库实际上都是关于非规范化数据的。
  • 您好,这似乎是个好主意。当从 post.group 保存到 user.group 时,我需要一种方法来推送组数据。这样数据是同步的。你知道怎么做吗?或者其他保持群组同步的方式?
  • 我在想像user.groups.push(post.group); user.save(callback);这样简单的事情
猜你喜欢
  • 2012-01-05
  • 2020-09-15
  • 2021-03-09
  • 2012-09-11
  • 1970-01-01
  • 2021-05-06
  • 2016-07-24
  • 1970-01-01
  • 2013-02-20
相关资源
最近更新 更多