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

-> 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(); 
    }); 
}); 
관련 문제