2017-07-14 11 views
1

こんにちは、私はnodejsとmongodbを初めて使っています。以下の構造を持つjsonファイルを持っています。 "comments"スキーマ入れ子/埋め込みスキーマの複数のレコードがmongodb、nodejsに挿入されていない

{ 
    "buyerId": "B58", 
    "sellerId": "SL8", 
    "comments": { 
     "title": "title5", 
     "body": "body5", 
     "date": "12-07-2017" 
    } 
} 

exports.post = function(req, res) { 
    const comments = [] 
    var s = new shipment(); 
    s.sellerId = req.body.sellerId; 
    s.buyerId = req.body.buyerId; 
    s.poId = req.body.poId; 
    s.comments.push({ 
     title: req.body.comments.title, 
     body: req.body.comments.body, 
     date: req.body.comments.date 
    }); 

    s.save(function(err) { 
     if (err) { 
      res.send(err); 
     } 
     console.log("added"); 
     res.send({ 
      message: 'shipment Created !' 
     }) 
    }) 
} 

の下に上記の「ポスト」機能は、私が唯一の「コメント」のセクションを持っているとき、私は意味し、データが正しく に挿入されます正常に動作しますように私は1つの関数を定義していますモンゴブ

{ 
    "_id": ObjectId("59689bc59058dbc812000002"), 
    "buyerId": "B58", 
    "sellerId": "SL8", 
    "comments": [{ 
     "title": "title5", 
     "body": "body5", 
     "date": ISODate("2017-12-06T18:30:00Z"), 
     "_id": ObjectId("59689bc59058dbc812000003") 
    }], 
    "__v": 0 
} 

下に示すように、私は複数の「コメント」を有する場合、以下に示すように、以下に示すよう

{ 
    "buyerId": "B58", 
    "sellerId": "SL8", 
    "comments": [{ 
      "title": "title5", 
      "body": "body5", 
      "date": "12-07-2017" 
     }, 
     { 
      "title": "title8", 
      "body": "body7", 
      "date": "12-07-2017" 
     } 
    ] 
} 

は次にコメント部のMongoDBに挿入されません。

{ 
    "_id": ObjectId("5968c04d4c02336800000002"), 
    "buyerId": "B57", 
    "sellerId": "SL7", 
    "comments": [{ 
     "_id": ObjectId("5968c04d4c02336800000003") 
    }], 
    "__v": 0 
} 

すべてのコメントセクションをmongodbに正しく挿入するには、どのような変更を行う必要がありますか?

+0

実際のスキーマは、質問の最初に指しているように、実際には「埋め込み」ではなく「参照」されているように見えます。また、これらの用語を調べて、その違いが何であるかを理解する必要があります。 2番目の例は実際にPOSTリクエストで送信されるデータを表していますか?最初はコンテンツが配列ではないので、それが単一の要素であるため '.push()'は大丈夫です。 2番目の形式は "配列"ですが、要素を反復せずに '.push() 'することはできません。 –

+0

しかし、他のすべての現実では、コアドキュメンテーションの['$ push'](https://docs.mongodb.com/manual/reference/operator/update/push/)演算子について実際に読む必要があります。あなたが現在行っていることよりはるかに優れています。 –

答えて

0

元のコメントは2番目の例の配列です。commentsは配列です。 あなたの関数

s.comments.push({ 
    title: req.body.comments.title, 
    body: req.body.comments.body, 
    date: req.body.comments.date 
}) 

は、コメントがオブジェクトである場合にのみ機能します。これをforループに入れて配列のように動作させてください。

for(var i = 0; i < req.body.comments.length; i++){ 
    s.comments.push({ 
     title: req.body.comments[i].title, 
     body: req.body.comments[i].body, 
     date: req.body.comments[i].date 
    }) 
} 
+0

あなたのヒントのおかげで、私はあなたのヒントのための少しの変更を行い、それは働いた、私は\t(var i = 0; i

+0

笑私の悪い、大丈夫私はそれを修正 –

0

すべてのプロパティの値を代入するのではなく、インスタンスを作成して本体を直接渡します。

const s = new shipment(req.body) 

そして、あなたが要求にデータを送信するときに、次の形式

{"buyerId": "B58", "sellerId": "SL8", "comments": [{ "title": "title5", "body": "body5", "date": "12-07-2017" }, { "title": "title8", "body": "body7", "date": "12-07-2017" } ] }

0

私は以下のようにしようと、それが働いたに送ります。

for(var i = 0; i < req.body.comments.length; i++){ 
s.comments.push(
{ title: req.body.comments[i].title, 
body : req.body.comments[i].body, 
date : req.body.comments[i].date }); 
} 
関連する問題