javascript - MongoDB- Mongoose : document structure/architecture

标签 javascript node.js mongodb mongoose mongoose-populate

我有一个相对简单的问题,但是,我一次又一次地陷入困境。我认为这是我第四次尝试重新构建我的文档以尝试获得所需的结果。

我想在 Mongoose 中创建一个具有以下结构的数据库:

一个用户拥有许多群组帖子评论群组帖子评论都属于用户。一个帖子可以属于多个,也可以不属于任何组。并且评论属于某个帖子

这是我到目前为止所拥有的:

用户架构

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....
        }]
    });

我在上面的结构中看到的唯一问题是该帖子需要成为群组的一部分,而我希望该帖子是可选的。据我所知,这也行不通。

如果您能就如何构建它提供任何建议,这将对我有很大帮助。

提前谢谢您。

最佳答案

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

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(...)

关于javascript - MongoDB- Mongoose : document structure/architecture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33932925/

相关文章:

javascript - 在 Javascript 中提取子字符串的更简单方法

node.js - "OCHI Root Hub Simulation"USB 设备是什么?

node.js - 连接jade中数组对象的内容以获得字符串

node.js - mongoose 不使用 findById 返回输出

node.js - 我们如何使用 mongoose 和 expressjs-nodejs 对 mongodb 中的 ObjectId 列进行排序?

javascript - 如何在我的输入值中添加总和并进行更改

javascript - 确认单选按钮选择

javascript - 如何使用 typescript 映射和过滤数组上的不同值?

node.js - 从我的nodejs服务器调用google apps脚本

Mongodb 动态地理查询