【问题标题】:Adding an array inside my Mongoose schema在我的 Mongoose 模式中添加一个数组
【发布时间】:2014-10-15 21:33:50
【问题描述】:

我有以下架构,我试图将一组 cmets 添加到我的博客文章架构中,然后在 cmets 架构内我需要添加一组与每个特定评论相关的图片 url。我研究了网络,发现这个链接 embedded documents 到 mongoose 文档,但注意到它与 mongoose 2.7 版有关,而我们目前是 3.8 版。所以想知道我做对了吗?如果不是,有人可以通过建议设计我的博客文章架构的最佳方法来帮助我,以便它包含 cmets 的博客文章数组以及与每个相关的图片数组评论。感谢您的时间和精力。

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var pictures = new Schema({
    picURL: String,
    date: {
        type: Date,
        default: Date.now
    }
});

var comments = new Schema({
    subject: String,
    body: String,
    date: {
        type: Date,
        default: Date.now
    },
    pictures:[pictures]
});

var blogpost = new Schema({
    title: String,
    body: String,
    date: {
        type: Date,
        default: Date.now
    },
    comments:[comments]
});

module.exports = mongoose.model('BlogPost', blogpost);

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    您有两种常见的情况,您希望如何处理您的信息

    嵌入式文档:

    如果您的读操作可能比写操作多,建议您采用这种方法,在这种情况下,您的模型可能是这样的:

    var comments = new Schema({
        subject: String,
        body: String,
        date: {
            type: Date,
            default: Date.now
        },
        pictures:[{
            picURL: String,
            date: {
                type: Date,
                default: Date.now
            }
        }]
    });
    

    而且你对我的方法还可以,应该在 3.8 上运行而没有潜在问题。

    参考文件:

    如果您的写入次数多于读取次数,您可以使用不同的集合来拆分信息并引用您的 objectId,例如:

    var comments = new Schema({
        subject: String,
        body: String,
        date: {
            type: Date,
            default: Date.now
        },
        pictures: [
                {type: Schema.Types.ObjectId, ref: 'pictures'}
        ]
    });
    

    您需要将每个模式分离成自己的模式,并为 cmets 和图像定义一个模型。

    如果你问我个人偏好是采用嵌入式文档方法,这两种方法都有效。

    编辑:

    这种情况可以应用于集合之间的N个关系,我对两个关系保持简单,但你的情况可能是这样的:

    var blogpost = new Schema({
        title: String,
        body: String,
        date: {
            type: Date,
            default: Date.now
        },
        comments: [{
            subject: String,
            body: String,
            date: {
                type: Date,
                default: Date.now
            },
            pictures:[{
                picURL: String,
                date: {
                    type: Date,
                    default: Date.now
                }
            }]
        }]
    });
    

    引用:

    var blogpost = new Schema({
        title: String,
        body: String,
        date: {
            type: Date,
            default: Date.now
        },
        comments:type: Schema.Types.ObjectId, ref: 'comments'}
    });
    

    希望有帮助。

    【讨论】:

    • 很抱歉,在这里我有点困惑,如果我嵌入或引用了图片和cmets,我将如何引用/嵌入cmets 到blogpost?我有 3 个模式(图片、评论和 BlogPost),一篇博文可以有 0 或 N 个 cmets,一篇博文 cmets 可以有 0 或 N 个 cmets,每个博文评论可以有 0 或 N 张图片,有意义吗?感谢您的宝贵时间
    • 我只是将其保留在 2 个级别,但同样的逻辑适用于您的集合中的 N 个关系
    • 检查更新,它非常简单,与您已有的相差不远。
    • 非常感谢您的澄清
    猜你喜欢
    • 2017-03-24
    • 1970-01-01
    • 2016-03-17
    • 2020-07-18
    • 1970-01-01
    • 2015-05-18
    • 2016-05-29
    • 1970-01-01
    • 2015-09-14
    相关资源
    最近更新 更多