2016-08-19 9 views
0

MongoDBのドキュメント内にネストされた配列の内部にネストされたドキュメントを削除しようとしています。mongooseを介して配列にネストされたドキュメントを削除します

スキーマ

{ 
    "_id": 12345, 
    "id": 12345, 
    "name": "Test", 
    "links": [], 
    "training": [], 
    "about": [ 
    { 
     "contents": "Test Contents 0", 
     "heading": "Test Heading 0" 
    }, 
    { 
     "contents": "Test Contents 1", 
     "heading": "Test Heading 1" 
    }, 
    { 
     "contents": "Test Contents 2", 
     "heading": "Test Heading 2" 
    } 
    ] 
} 

私は私が送信した場合、その

'/:_id/:section/:item' 

このようなルートと一致したサブドキュメントを削除するDELETE/12345/about/1に、「テストは、見出し1」を含むサブドキュメントう完全に削除する。

私は、このような

.delete(function (req, res) { 
    var section = req.params.section_name; 
    var item = req.params.item; 

    Tool.findOne({'id': req.params._id}, function (err, tool) { 
     tool.set(section[item], null); 
     tool.save(function (err) { 
      res.send(err); 
     }) 
    }); 
}); 

など、さまざまな方法を試してみたが、どれも動作するようには思えません。

ご協力いただければ幸いです。

答えて

1

これは完全に

.delete(function (req, res) { 
    var section = req.params.section_name; 
    //convert string to int 
    var item = +req.params.item; //or use parseInt(req.params.item) 

    Tool.findOne({'id': req.params._id}, function (err, tool) { 
     tool[section].splice(item, 1); 
     tool.save(function (err) { 
      res.send(err); 
     }) 
    }); 
}); 

それは

array.splice(index, 1); 

スプライスの2番目のパラメータは、削除する要素の数であるスプライスについて

tool[section].splice(item, 1); 
tool.about.splice(1, 1); //remove 1 item from given index 

に変換されます動作するはずです。スプライスは、配列内の配列を変更し、削除された要素を含む新しい配列を返します。

+0

Strange。それは '未定義 'に設定されていません。それは正しい文書を取得していますが、実際には設定していません。 – SlashTag

+0

'splice'を使ってみてください。回答は –

+0

です。それはうまくいった。ありがとう! – SlashTag

0
Tool.findOneAndUpdate(
{ 
    "_id": req.params._id, "about.heading": "Test Heading 1" 
    // 1. query above will target the document by _id. 
    // 2. search [about] and get index then store it at "$", 
    // 3. "Test Heading 1" is located at about[1], store it at "$" 
    // 4. imagine this line is executed => var $ = 1 
}, 
{ 
    $unset: {"about.$": 1} 
}, 
{ 
    new:true //means return the updated document (new instead old) 

}) 
.exec((err, tool)=>{ 
    if(err) console.log(err) 
}) 
+0

多分私ははっきりしませんでしたが、私の意図は '/ id/section/item'と完全に一致するサブ文書全体を完全に削除することです。参照: "/ 12345/about/1にDELETEを送信すると、" Test Heading 1 "を含むサブ文書が完全に削除されます。 基本的には、(_idまたはidを指定して)ドキュメント内の配列(配列の名前が与えられている)内のアイテム(インデックスが与えられている) – SlashTag

関連する問題