2017-01-24 1 views
1

원시 mongodb 드라이버를 사용하여 노드 JS에서 명령을 작성하여 문서 객체 안에있는 객체에서 키 값 쌍을 제거하려고합니다.MongoDB 노드 JS - 문서 객체 내부의 객체에서 항목을 삭제하는 중

{ 
    "name" : "PrakashPM" 
    "data" : { 
       "Jan-2017" : "2,3,1", 
       "Dec-2016" : "1,2,0", 
       "Nov-2016" : "9,9,9" 
      } 
    }, 
    { 
    "name" : "Valavan" 
    "data" : { 
       "Jan-2017" : "1,1,1", 
       "Dec-2016" : "3,3,3", 
       "Nov-2016" : "9,9,9" 
      } 
    } 

내 목표는 "12 월 2016"을 제거하는 것입니다 :

나는 다음과 같은 형식으로 MongoDB를 수집있다 "1,2,0" "이름이"내부 인 : " PrakashPM "

내 코드 :

var mongoName = 'PrakashPM'; 
var mongoDate = "'data'.'Dec-2016'"; 
// TRIALS 
// var mongoDate = "data.'Dec-2016'"; 
// var mongoDate = "data.Dec-2016"; 


var mongoVal = "'1,2,0'"; 
// TRIALS 
// var mongoVal = "1,2,0"; 


mycollection.update({ name: mongoName }, 
{ $unset: {mongoDate : mongoVal} } 
); 

참고 : 나는 위의 오페라를하고 있어요 PUT 요청 기능 내부.

입력 값 (mongoDate, mongoVal)에 대해 여러 가지 가능한 방법 (시도)을 시도했지만 아래 결과를 얻을 수 없습니다.

또한 키를 사용하여 키 값 쌍 항목을 제거 할 수 있습니까? (즉,이 경우 {$ 해제 : {mongoDate}}에서 같은 또는 무언가)

예상 결과 :

{ 
    "name" : "PrakashPM" 
    "data" : { 
       "Jan-2017" : "2,3,1", 
       "Nov-2016" : "9,9,9" 
      } 
    }, 
    { 
    "name" : "Valavan" 
    "data" : { 
       "Jan-2017" : "1,1,1", 
       "Dec-2016" : "3,3,3", 
       "Nov-2016" : "9,9,9" 
      } 
    } 
+1

'req.body' 콘텐츠 샘플을 더 제공 할 수 있습니까? 특히'req.body.timerData'와'req.body.time'의 차이는 무엇입니까? 또한 당신의 코드에서'timerName'은 무엇입니까? –

+0

모든 혼란을 드려 죄송합니다. @SantanuBiswas 나는 적절한 값으로 질문을 편집했다. 'find ({name : mongoName}) '를 사용하여 레코드를 검색 할 수 있습니다; 문제는 $ unset 조건이거나 첫 번째 인수에서 추가 쿼리 일 수 있습니다. – Mikki

+0

아래 내 답장을 참조하십시오. 문제를 파악하고 해결책을 제시했습니다. –

답변

1

을 req.body.timerDate 정확히 MongoDB를 같이 달 - 날짜 문자열 값이 있다고 가정하면,이 작업을해야합니다. (documentation 참조).

문자열을 키로 사용해야합니다. 변수 이름을 사용할 수 없습니다.

// Assuming that req.body.timerDate 
// has the month-date as stored in MongoDB (case-sensitive match) 

var reqDate = "data." + req.body.timerDate; 
var reqName = req.body.name; 

var _unset = {}; 
_unset[reqDate] = ""; 

mycollection.update({ name: reqName }, { $unset: _unset }) 
0

당신은 객체의 키로서 변수를 사용하려고합니다.

mycollection.update({ timerName: mongoName }, 
{ $unset: {mongoDate : mongoVal} } 
); 

예상대로 작동하지 않으며 일반적인 JavaScript 개념 (mongodb 문제는 아님)입니다. "timerName"키가 "mongoName"변수의 내용과 동일한 행을 업데이트하려면 mongo에 쿼리를 보내야합니다. 그러나 적절한 키는 "이름"입니다.

이 시도 :

mycollection.update({ name: mongoName }, 
{ $unset: {data : mongoVal} } 
); 
+0

죄송합니다.혼란을 피하기 위해 제 질문을 편집했습니다. 'find ({name : mongoName}) '를 사용하여 레코드를 검색 할 수 있습니다; 문제는 $ unset 조건입니다. 귀하의 제안에도 불구하고, 데이터 대신 "데이터", 즉 "Dec-2017"또는 "data.Dec-2017"이되어서는 안됩니까? BTW, 내 제안도 잘 작동하지 않았다. – Mikki

1

다음 예를 사용하여 컬렉션을 업데이트하십시오. 당신은 당신의 쿼리 및 업데이트 문서를 만들 수 bracket notation를 사용할 필요는 구조가 업데이트 작업이 필요 즉 : 귀하의 작업에 사용할 개체를 구성하는 변수를 사용하여, 그래서

db.mycollection.update(
    { 'name': 'PrakashPM' }, 
    { 
     '$unset': { 
      'data.Dec-2016': '' 
     } 
    } 
) 

var mongoName = 'PrakashPM'; 
var timerDate = 'Dec-2016'; 
var query = {}; 
var update = {'$unset': {}}; 
query['name'] = mongoName; 
update['$unset']['data.'+timerDate] = ''; 

db.mycollection.update(query, update) 
관련 문제