MongoDB - Mongoose:文档结构/体系结构

时间:2015-11-26 07:35:33

标签: javascript node.js mongodb mongoose mongoose-populate

我有一个相对简单的问题,然而,我一直被卡住,一遍又一遍。我认为这是我第四次尝试重新构建我的文档以尝试获得所需的结果。

我想用mongoose创建一个数据库,结构如下:

用户有许多群组帖子评论群组帖子评论都属于用户帖子可以属于许多,也可以不属于。评论属于某个帖子

这是我到目前为止所做的:

UserSchema

var userSchema = mongoose.Schema({

    local            : {
        email        : String,
        password     : String,
        username     : String,  
        created: {type:Date, default: Date.now} 

    }

});

PostSchema

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

groupSchema

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

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

如果您有任何关于如何构建的建议,那将对我有很大的帮助。

提前谢谢你。

1 个答案:

答案 0 :(得分:0)

您最好的办法是在帖子文档中嵌入您的小组和评论模式。例如,

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