2016-10-25 13 views
0

私は、次のスキーマを持っている:マングースメソッドをネストすることは可能ですか?

var ItemSchema = new Schema({ 
    name: String, 
    completed: Boolean, 
    priority: String, 
    dueDate: String 
}); 

var ListSchema = new Schema({ 
    name: String, 
    items: [ItemSchema] 

}); 

私はItemSchemaのインスタンスに到達したいです。私は巣2つのマングースの方法がそうのように、それに到達することができます。

router.route('/lists/:list_id/items/:items_id') 
    .put(function(req, res) { 
     List.findById(req.params.list_id, function(err, list) { 
      if (err) { 
      res.send(err); 
      } 
      list.items.findByIdAndRemove(req.params.items_id, function(err, item) { 
       if (err) { 
       res.send(err); 
      } 
      console.log(item); 
      res.json(list); 
      });` 
+0

てみましたか? – adeneo

+0

はい、動作しません。 – Amituuush

+1

質問に答えるために、はい、それを入れ子にすることは可能です。しかし、あなたがしようとしていることは機能しません。それは、 'list.items'はObjectIDの配列です。それを削除したい場合は、標準の配列操作、スライス、スプライス、ポップ、その他のものをリストから削除する必要があります。次に、 'list'オブジェクトを新しい項目で更新する必要があります。 'List.findById'で' populate'を試みるかもしれませんが、 'items'を文書の配列にするとは思いません。オブジェクトに塗りつぶすだけだと思います。更新関数を得るために 'items'が文書の配列になる必要があります –

答えて

0

を私は.findByIdを使用して、その後、その_idによって文書を検索するための特別なid方法を使用して問題にはるかに簡単な解決策を見つけました。これは、あなたがMongooseのメソッドを入れ子にすることができるかどうかにはかかわらず、親の中のサブ文書にアクセスする解決策には答えません。ここで

Mongoose Sub Document Documentation

ソリューションです:あなたはそれを

router.route('/lists/:list_id/items/:items_id') 
.put(function(req, res) { 
    List.findById(req.params.list_id, function(err, list) { 
     if (err) { 
     res.send(err); 
     } 

     var item = list.items.id(req.params.items_id); 
     item.completed = true; 
     list.save(function (err, result) { 
      if (err) { 
       res.send(err); 
      } 
      res.json(result); 
     }) 
    }) 
}) 
関連する問題