2016-07-22 15 views
1

MongoDBに配列とともに第1レベルのデータを含むJSONオブジェクトを記述しようとしています。MongooseはJSON配列からサブ文書を作成しません

代わりに、すべての第1レベルのデータが格納されますが、配列に含まれるものはすべて格納されません。サーバーが受け取るデータをログに記録すると、オブジェクト全体が表示され、私のMongooseコードに何か問題があると信じられます。

は、ですから、例えば、私はこのような何かを送信する場合:

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

のみ以下が格納されます:

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

I持ってMongoのための次のモデル:

//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); 
    }); 
}); 

同様に、データを格納するAngularコントローラの一部です。私はここに何か問題はないと思う。マングースよくある質問の最初の質問で

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

ルック: http://mongoosejs.com/docs/faq.html

マングースは、配列インデックスのgetter/setterを作成しません。彼らがいなくても、変化を通知されることはないので、新しい価値を維持することは知られていません。回避策は、Mongoose> = 3.2.0で利用可能なMongooseArray#を使用することです。

// 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

すごい、私はそれを試してみましょう。モンゴースがこれをサポートしていないことに失望する少し... –

関連する問題