Храните неструктурированный объект JavaScript в MongoDB с помощью Mongoose+Node.js

В моем приложении node.js мне нужно хранить неструктурированные объекты JavaScript в MongoDB. Я указал следующую модель в Mongoose:

module.exports = mongoose.model('DBAllocation', {
    from: Date,
    expires: Date,
    userSession: Object,
    allocationTimestamp: Date,
    allocationPriority: Number,
    vmGroupID: String,
    allocationRequestContent: Object
});

Указав типы данных userSession и allocationRequestContent как тип Object, я хотел сохранить объект JavaScript (без указания его структуры) в MongoDB и получить его как есть. Но когда я сохраняю модель в базу данных, я получаю внутреннюю ошибку. Я попытался сохранить следующие элементы:

var allocation = new Allocation({
                        _id: allocationID,
                        from: Date.now(),
                        expires: null,
                        userSession: authorizedRequest.session,
                        allocationTimestamp: Date.now(),
                        allocationPriority: <some number>,
                        vmGroupID: <some number>,
                        allocationRequestContent: authorizedRequest.requestContent
                    });

authorizedRequest.session и authorizedRequest.requestContent — это два объекта JavaScript. Но когда я заменяю их обоих на {}, модель успешно сохраняется. Я слышал о параметре strict, который мы можем использовать для хранения неструктурированных данных, но я сомневаюсь, что смогу использовать его для достижения того, что мне нужно. Есть ли способ сделать это в любом случае? Любая помощь могла бы быть полезна.

Обновление:

Я выяснил, что authorizedRequest.session — это модель MongoDB, и заменил ее на authorizedRequest.session.toObject(), а authorizedRequest.requestContent — на простой объект, такой как {'cat': '123', 'dog': '456'}, и он был успешно сохранен. Не могу понять, что происходит.

authorizedRequest.requestContent включает следующий объект.

{
        "group":[
            {
                "vm_count":[
                    "10"
                ],
                "image":[
                    {
                        "type":[
                            "iso"
                        ],
                        "id":[
                            "280b40d0-6644-4e47-ac7c-074e2fa40cd4"
                        ]
                    }
                ],
                "cpu":[
                    {
                        "cores":[
                            "1"
                        ],
                        "frequency":[
                            "1"
                        ],
                        "unit":[
                            "GHz"
                        ],
                        "architecture":[
                            "x86"
                        ]
                    }
                ],
                "min_memory":[
                    {
                        "size":[
                            "2"
                        ],
                        "unit":[
                            "GB"
                        ]
                    }
                ],
                "min_storage":[
                    {
                        "primary":[
                            "5"
                        ],
                        "unit":[
                            "GB"
                        ]
                    }
                ],
                "network":[
                    {
                        "min_bandwidth":[
                            "8"
                        ],
                        "unit":[
                            "mbps"
                        ]
                    }
                ],
                "priority":[
                    "3"
                ],
                "allocation_time":[
                    {
                        "schedule":[
                            {
                                "date":[
                                    {
                                        "$":{
                                            "year":"",
                                            "month":"",
                                            "date":""
                                        }
                                    }
                                ],
                                "time_from":[
                                    ""
                                ],
                                "time_to":[
                                    ""
                                ]
                            }
                        ]
                    }
                ]
            }
        ],
        "session_id":[
            "3deb1bb861f34b527e6709c655fff139b36c2dc43d8b3e29e3914bf8b23ce069"
        ]
    }

Спасибо.


person Deepal    schedule 04.02.2015    source источник
comment
Пробовали Schema.Types.Mixed ( mongoosejs.com/docs/schematypes.html)?   -  person joao    schedule 04.02.2015
comment
Ага. Но все равно не работает. Кажется, что будет принят только простой объект. Когда сам объект содержит вложенные объекты, он выдает внутреннюю ошибку.   -  person Deepal    schedule 04.02.2015
comment
Можете ли вы добавить подробности ошибки, которую вы получаете, к своему вопросу?   -  person JohnnyHK    schedule 04.02.2015
comment
@JohnnyHK, я не получаю подробную информацию об ошибке! При отладке я получаю только Internal Error! Value is null   -  person Deepal    schedule 04.02.2015
comment
@Deepal Судя по вашему обновлению, в authorizedRequest.requestContent есть что-то, что нельзя сериализовать в BSON, чтобы его можно было сохранить в коллекции. Что это содержит?   -  person JohnnyHK    schedule 04.02.2015
comment
@JohnnyHK, я обновил свой вопрос, включая содержание authorizedRequest.requestContent. Как я могу определить, можно ли его сериализовать в BSON?   -  person Deepal    schedule 04.02.2015
comment
@Deepal Вероятно, проблема в том, что ключ $, поскольку $ является зарезервированным символом в именах полей MongoDB. Вам нужно будет изменить это.   -  person JohnnyHK    schedule 04.02.2015
comment
@JohnnyHK, вау. Спасибо, что указали на это, вы можете включить свой комментарий в качестве ответа, чтобы я мог принять. Большое спасибо.   -  person Deepal    schedule 05.02.2015


Ответы (1)


Проблема, вероятно, заключается в ключе $ в объекте authorizedRequest.requestContent, поскольку имена полей MongoDB не могут начинаться с $.

Возможные обходные пути см. в документах.

person JohnnyHK    schedule 05.02.2015