Mongoose + NodeJS Phorum 模式

Posted

技术标签:

【中文标题】Mongoose + NodeJS Phorum 模式【英文标题】:Mongoose + NodeJS Phorum Schema 【发布时间】:2013-05-15 07:45:34 【问题描述】:

嗨,我正在用 NodeJS 和 MongoDB 构建一个 phorum。我对这种技术真的很陌生,我有一些问题。我有当前的模式来构建这个。有领域,有类别,有主题,有答案:

var Phorum = [

    position: 1,
    name: [
        
            lang: 'es',
            value: 'Ideas'
        
    ],
    categories: [
        
            position: 1,
            name: [
                
                    lang: 'es',
                    value: 'Interfaz visual'
                
            ],
            topics: [
                
                    createdAt: 'xxx',
                    updatedAt: 'xxx',
                    userId: 123,
                    status: 1,
                    spam: false,
                    views: 42,
                    likes: [321,231],
                    details: [
                        
                            lang: 'es',
                            title: 
                                normal: 'Tengo una pregunta',
                                url: 'tengo-una-pregunta'
                            ,
                            text: 
                                original: 'El texto...',
                                formated: 'El texto...' // Esta con los enlaces y todo reemplazado
                            ,
                            tags: ['tag1', 'tag2']
                        
                    ],
                    answers: [
                        
                            createdAt: 'xxx',
                            updatedAt: 'xxx',
                            likes: [231, 321],
                            text: [
                                
                                    lang: 'es',
                                    createdAt: 'xxx',
                                    original: 'Respuesta...',
                                    formated: 'Respuesta...' // Con enlaces, videos,... formateado
                                
                            ]
                        
                    ]
                
            ]
        
    ]

];

有一个嵌入文档,在代码中我写了这样的内容:

var mongoose = require('mongoose'),
    Schema = process.DB.Schema,
    ObjectId = process.DB.ObjectId;


/*
 * ESQUEMA DE LOS DETALLES DE UN TEXTO
 * Se usa en las respuestas y en los topics
 */
var textSchema = new Schema(
    createdAt: type: String, default: Date.now,
    original: String,
    formated: String
);


/*
 * ESQUEMA DEL TEXTO DE UNA RESPUESTA
 */
var TextAnswerSchema = new Schema(
    lang: type: String, required: true, trim: true, lowercase: true,
    text: [textSchema]
);

// Esquema de las respuestas
var AnswersSchema = new Schema(
    createdAt: type: Date, default: Date.now,
    likes: type: [ObjectId], ref: 'User', unique: true,
    text: [TextAnswerSchema]
);

// Esquema de los detalles de un topic
var DetailsTopicSchema = new Schema(
    lang: type: String, required: true, trim: true, lowercase: true,
    title: 
        original: String,
        url: String
    ,
    text: [textSchema],
    tags: type: [String], unique: true, trim: true
);

// Esquema para un topic
var TopicsSchema = new Schema(
    createdAt: type: Date, default: Date.now,
    //userId: type: ObjectId, ref: 'User',
    userId: type: Number,
    status: type: Number, default: 1, min: 1, max: 3,
    spam: type: Boolean, default: false,
    views: type: Number, default: 0, min: 0,
    //likes: type: [ObjectId], ref: 'User', unique: true,
    details: [DetailsTopicSchema],
    answers: [AnswersSchema]
);



// Detalles de los nombres de una categoria
var DetailsNameSchema = new Schema(
    lang: type: String, required: true, trim: true, lowercase: true,
    value: type: String, trim: true
);

// Esquema de las categorias
var CategoriesSchema = new Schema(
    position: type: Number, default: 9999,
    name: [DetailsNameSchema],
    topics: [TopicsSchema]
);

// La estructura de la coleccion tracker
var AreasSchema = new Schema(
    position: type: Number, default: 9999,
    name: [DetailsNameSchema],
    categories: [CategoriesSchema]
);

// Exponemos los modelos
// Guardamos en los modelos de mongoose
mongoose.model('AreasSchema', AreasSchema);
mongoose.model('CategoriesSchema', CategoriesSchema);
mongoose.model('DetailsNameSchema', DetailsNameSchema);
mongoose.model('TopicsSchema', TopicsSchema);
mongoose.model('DetailsTopicSchema', DetailsTopicSchema);
mongoose.model('AnswersSchema', AnswersSchema);
mongoose.model('TextAnswerSchema', TextAnswerSchema);
mongoose.model('textSchema', textSchema);

但是当我使用“mongoose.model('abc', abc);”时猫鼬建立一个集合。我只想要一个集合,因为我读到它更好,更有效。

如果我想要一个包含大 JSON 对象的集合,我如何阅读一些主题?像这样的:

AreaModel.find('categories.topics.id': 'xxx', function())

但是,它可以在没有类别 id 的主题 id 中找到吗?

也许我的架构错了。 谢谢大家。

【问题讨论】:

【参考方案1】:

这是一个控制器,用于在某个区域的某个类别的某个主题中添加答案,看起来很疯狂:

    // new answer in topic
    server.post('/api/v1/tracker/topics/:topicID', function(req, res, next)

        // To JSON
        var topicID = req.params.topicID,
            body = JSON.parse(req.body);

        // If not is array
        if(body.details && !__.isArray(body.details))
            body.details = [body.details];
        

        //Find topic
        AreaModel.findOne('categories.topics._id': topicID, 'categories.topics._id categories._id categories.topics.answers', function(err, doc)
        //AreaModel.findOne('categories.topics._id': topicID, function(err, doc)


            // Find the current topic
            __.find(doc.categories[0].topics, function(topic, key) 

                // If find
                if(topic._id == topicID)

                    var TextAnswerSchema = mongoose.model('TextAnswerSchema'),
                        AnswersSchema = mongoose.model('AnswersSchema'),
                        arrayAnswers = [],
                        det;

                    // Each response can be in diferent langs
                    __.each(body.details, function(detail)

                        det = new TextAnswerSchema(
                            lang: detail.lang,
                            original: detail.value,
                            formated: detail.value
                        );
                        arrayAnswers.push(det);

                    );

                    // Answer
                    var answers = new AnswersSchema(
                        text: arrayAnswers
                    );

                    // Add to doc in correct place
                    doc.categories[0].topics[key].answers.push(answers);

                    // Save to mongodb
                    doc.save(function(err, doc)

                        if(err)
                            console.log(err);
                        
                        res.send(doc);

                    );

                

            );
        );

    );

;

【讨论】:

以上是关于Mongoose + NodeJS Phorum 模式的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB / Mongoose / nodejs 中的引用 - 并行化

egg-mongoose --- nodejs

nodejs mongoose安装问题

Mongoose + NodeJS - 循环浏览文档? [复制]

nodejs中使用mongoose保存数据

nodejs中使用mongoose保存数据