2016-07-22 3 views
1

Я пытаюсь написать объект JSON, который содержит данные первого уровня вместе с массивами в MongoDB.Mongoose не создает субдокумент из массива JSON

Что происходит, но все данные первого уровня хранятся, но все, что содержится в массиве, не является. При регистрации данных, которые получает сервер, я вижу весь объект, что заставляет меня думать, что что-то не так с моим кодом Mongoose.

Так, например, если я отправить что-то вроде этого:

issueId: "test1", 
issueTitle: "testtest", 
rows: [ 
    {order:1,data: [object]}, 
    {order:2,data: [object]}, 
] 

Только следующие получает хранится:

issueId: "test1", 
issueTitle: "testtest", 
lastUpdated: Date, 

У меня есть следующая модель для Монго:

//model.js 
var mongoose = require('mongoose'); 

var model = mongoose.Schema({ 

    issueId  : String, 
    issueTitle : String, 
    lastUpdated : {type: Date, default : Date.now}, 

    rows : [{ 
    order : Number, 
    data  : [ 
     { 
     title : String, 
     text : String, 
     link : String, 
     } 
    ] 
    }] 

}); 

module.exports = mongoose.model('Model', model); 

И код маршрутизации, где я считаю, что проблема, вероятно, такова:

//routes.js 
const mongoose = require('mongoose'); 
const Model = require('./model.js'); 
... 
app.post('/api/data/update', function(req, res) { 
    let theData = req.body.dataToInsert; 

    console.log(JSON.stringify(theData,null,4)); 

    Model.findOneAndUpdate(
    {issueId : theData.issueId}, 
    {theData}, 
    {upsert: true}, 
    function(err,doc){ 
     if(err) throw err; 
     console.log(doc); 
    }); 
}); 

Кроме того, вот часть углового контроллера, хранящего данные. Я не думаю, что здесь есть какие-то проблемы.

pushToServer = function() { 
    $http.post('/api/data/update',{ 
     dataToInsert : $scope.dataObject, 
    }).then(function successCallback(res){ 
     console.log("all good", JSON.stringify(res,null,3)); 
    }, function errorCallback(res){ 
     console.log("arg" + res); 
    }); 
    } 

ответ

1

Посмотрите на первый вопрос в мангустов FAQ: http://mongoosejs.com/docs/faq.html

Mongoose не создает геттеры/сеттеры для индексов массива; без них mongoose никогда не получает уведомление об изменении, и поэтому не знает, чтобы сохранить новую ценность. Обход должен использовать набор MongooseArray #, доступный в Mongoose> = 3.2.0.

// query the document you want to update 
// set the individual indexes you want to update 
// save the document 
doc.array.set(3, 'changed'); 
doc.save(); 

EDIT

Я думаю, что это будет работать, чтобы обновить все строки. Мне было бы интересно узнать, работает ли это.

let rowQueries = []; 
theData.rows.forEach(row => { 
    let query = Model.findOneAndUpdate({ 
     issueId: theData.issueId, 
     'row._id': row._id 
    }, { 
     $set: { 
      'row.$': row 
     } 
    }); 
    rowQueries.push(query.exec()); 
}); 

Promise.all(rowQueries).then(updatedDocs => { 
    // updated 
}); 
+0

Arg okay. Можно ли интегрировать это с текущим методом Model API? –

+0

Это отличный вопрос. Я не нашел способ обновить все существующие «строки» за одно обновление. Я думаю, вам нужно будет обновлять каждую строку по отдельности. Я обновлю ответ, чтобы сделать это. –

+0

Удивительно, я попробую это. Немного разочаровывает, что Mongoose не поддерживает это ... –

Смежные вопросы