2017-05-21 1 views
0

npmパッケージmongojsを使用すると、変数を使用してネストされたオブジェクトにアクセスする必要があります。以下では、しかし、動作しません:変数を使用してMongoDBネストされたオブジェクトにアクセスする

let userID = req.user._id, 
     marketName = req.body.marketName, 
     itemName = req.body.item.itemName, 
     crossOff = req.body.item.isCrossed; 

    markets.updateOne(
     { 
     _id: userID, 
     "marketList.marketName": marketName 
     }, 
     {$set : {`marketList.$.shoppingList.${itemName}.isCrossed`: crossOff}}, 
     (err, doc) => { 
     if(err) { res.status(400).send('Bad Request') } 
     else { res.status(204) } 
     res.end(); 
     }); 
    }); 

あなたは、このような状況で、したがってunexpected template stringエラーをテンプレート文字列を使用しないように。

変数をキーとして使用するためにカッコ表記を使用することは可能ですが、文字列として格納されたキー全体で変数を設定することはできません。支援するため

、ここでのサンプルは、文書構造である:

{ 
    _id: ObjectId(...), 
    marketList: [ 
    { marketName: 'ralphs', 
     shoppingList: { 
     "cookies": { itemName: "cookies", isCrossed: false }, 
     "moar cookies": { itemName: "moar cookies", isCrossed: true } 
    }, 
    { 
     marketName: 'gelsons', 
     shoppingList: { 
     "even moar cookies": { itemName: "even moar cookies", isCrossed: true } 
     } 
    } 
    ] 
} 

私のオプションは何ですか?

+1

なぜあなただ​​けのオブジェクトを作成し、キーのブラケットを使用することができないために使用することができますか?テンプレート文字列は文法的な砂糖だけです。それらを使うことができれば、オブジェクトを使うことができます。 – adeneo

+0

@adeneo私はmarketNameの場所が何であるか分かりません。それ以外の場合は、単にブラケット記法を使用します。 – Shadow

+0

as - > https://jsfiddle.net/adeneo/j7tc7muL/1/ – adeneo

答えて

0

事前にクエリを作成することができ、そのようにブラケット表記はキー

let userID = req.user._id, 
    marketName = req.body.marketName, 
    itemName = req.body.item.itemName, 
    crossOff = req.body.item.isCrossed, 
    query  = {}; 

query["marketList.$.shoppingList." + itemName + ".isCrossed"] = crossOff; 

markets.updateOne({ 
     _id: userID, 
     "marketList.marketName": marketName 
    }, { 
     $set: query 
    }, (err, doc) => { 
     if (err) { 
     res.status(400).send('Bad Request'); 
     } else { 
     res.status(204); 
     } 
     res.end(); 
    }); 
}); 
関連する問題