调用自己的Mongoose Schema没有得到_id

时间:2017-11-28 17:38:40

标签: node.js mongodb mongoose

所以我试图创建一个作为项目的mongoose模式。该项目下方可能包含子项目。例如:

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

var ItemSchema = new Schema({
    description: { en_US: String },
    title: { en_US: String },
    subtitle: { en_US: String },
    type: String,
    value: Schema.Types.Mixed,
    items: [{type: Schema.Types.Object, ref: 'ItemSchema'}]
});

module.exports = mongoose.model('Item', ItemSchema);

当我调用代码并传递看起来像这样的项目对象json时:

"items": [{
            "type": "photo",
            "title": {
                "en_US": "Add Photo"
            }
        },
        {
            "required": true,
            "type": "list",
            "title": {
                "en_US": "Select Type of Call"
            },
            "items": [{
                    "type": "list_option",
                    "title": {
                        "en_US": "Homework Help"
                    }
                },
                {
                    "type": "list_option",
                    "title": {
                        "en_US": "Not Available"
                    }
                }
            ]
        }]

照片和列表项目得到_id而不是其他项目......结果如下:

 "items": [
        {
            "type": "photo",
            "_id": "5a1d99f5ceec230014b83d81",
            "items": [],
            "title": {
                "en_US": "Add Photo"
            }
        },
        {
            "type": "list",
            "_id": "5a1d99f5ceec230014b83d80",
            "items": [
                {
                    "title": {
                        "en_US": "Homework Help"
                    },
                    "type": "list_option"
                },
                {
                    "title": {
                        "en_US": "Not Available"
                    },
                    "type": "list_option"
                }
            ]
         }]

我永远不会知道会有多少子项目,或者它可以达到10个级别的子项目(例如car-ford-compact-escort(每个不同的子级别))。如何获取项目为其拥有的所有子项创建_ids?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

好的,我找到了解决方法。因此,首先,数据作为单个对象进入函数,其中包含多个项目。我要做的就是编写一个函数,用一个包含_id的mongoose模式创建循环操作。以下是mongoose模式的外观:

var ItemSchema = new Schema({
    _id: Schema.Types.ObjectId,
    description: { en_US: String },
    title: { en_US: String },
    type: String,
    value: Schema.Types.Mixed,
    items: [{type: Schema.Types.Object, ref: 'ItemSchema'}]
});

现在,当我保存数据时,我无法立即保存整个项目对象。相反,我需要走过这些项目并将每个项目分开保存,如下所示:

function nextItem(item){
    var saveItem = Item({
        _id: new mongoose.Types.ObjectId,
        description: item.description,
        title: item.title,
        type: item.type,
        value: item.value
    });

    var fullItem = saveItem;

    if(item.items){
        fullItem.items = [];
        item.items.forEach(function(item){
             var tempItem = newItem(item);
             fullItem.items.push(tempItem);
        });
        return fullItem
    } else {
        return fullItem
    }
}

这会创建正确的Items对象,并且_ids是唯一的,所以我可以稍后搜索它们。它甚至允许我对其他对象中的items数组执行相同的操作,并使用正确的项_ids保存父对象。我希望这也可以帮助别人。