2016-09-21 4 views
1

MongoDB의 배열 요소를 업데이트하는 데 문제가 있습니다. 이것은 문서의 구조입니다 :MongoDB 문서에서 배열 요소를 업데이트하는 방법

{ 
     "_id" : ObjectId("57e2645e11c979157400046e"), 
     "site" : "BLABLA", 
     "timestamp_hour" : 1473343200, 
     "values" : [ 
       { 
         "1473343200" : 66 
       }, 
       { 
         "1473344100" : 230 
       }, 
       { 
         "1473345000" : 479 
       }, 
       { 
         "1473345900" : 139 
       } 
     ] 
} 

이제 "1473345900"키를 사용하여 요소를 업데이트하고 싶습니다. 어떻게해야합니까? 나는 시도했다 :

{ 
     "_id" : ObjectId("57e2645e11c979157400046e"), 
     "site" : "BLABLA", 
     "timestamp_hour" : 1473343200, 
     "values" : [ 
       { 
         "1473343200" : 66 
       }, 
       { 
         "1473344100" : 230 
       }, 
       { 
         "1473345000" : 479 
       }, 
       0 
     ] 
} 

내가 잘못 무엇 :

db.COLLECTIONNAME.update({"values.1473345900": {$exists:true}}, {$set: {"values.$": 0}}) 

그러나 문서처럼 보이는 그 이후

? 1473345900 값을 임의의 값으로 업데이트하고 싶습니다 ... 전체 요소를 업데이트하고 싶지 않습니다 ...

감사합니다.

답변

2

업데이트 할 배열 요소와 일치하는 추가 쿼리를 업데이트에 추가해야합니다. 일반적인 질의는 요소의 값이 업데이트되는 것과 같지 않은지 검사하는 것을 포함합니다. $ 위치 연산자 해시 키 배열 요소 { "1473345900": 139 } 정확한 인덱스 위치를 식별하는 곳에

다음 예

이 업데이트를 나타낸다. 당신이 $ 위치 연산자없이 업데이트 작업을 실행하려고하면 :

db.COLLECTIONNAME.update(
    { "values.1473345900": { "$exists": true } }, 
    { "$set": { "values.1473345900": 0 } } 
) 

몽고는 인덱스 위치로 타임 스탬프 1,473,345,900을 취급하고, 따라서 오류를 얻을 것이다

는 백필 수 없습니다 1,500,000보다 큰 요소

를 배열에 따라서 적절한 방법은 다음과 같아야

012,351,
var val = 32; 
db.COLLECTIONNAME.update(
    { "values.1473345900": { "$ne": val, "$exists": true } }, 
    { "$set": { "values.$.1473345900": val } } 
) 
+0

문제는 다음과 같습니다. ** ** 1473345900 **이 이미 존재하는지 모르겠습니다. 그래서 1) ** 1473345900 **이 있는지 알아야하고 2) ** 1473345900 ** 값을 업데이트해야합니다. 죄송합니다. 설명해 드리지 못했습니다 ... – tmieruch

+1

'db.sites.update ({ "values.1473345900": {$ exists : true}}, {$ set : { "values. $. 1473345900": 0}}) '그렇게 할 것입니다. Thx, Chridam !!! – tmieruch

관련 문제