2014-10-29 1 views
1

먼저 내 문서의 구조 :Monk를 사용하여 Javascript의 forEach 루프에서 문서를 업데이트하는 방법은 무엇입니까?

{ 
    "_id": "541a8bea74123744b371d38e", 
    "geometry": { 
    "type": "Point", 
    "coordinates": [ 
     5.3435, 
     51.69554 
    ] 
    }, 
    "type": "Feature", 
    "properties": { 
    } 
} 

것은 내가 foreach 루프에서 업데이트 기능을 사용하여 필드를 추가 할 수 있습니다. 루프가 작동하지만 컬렉션의 모든 문서를 반복 할 수 있지만 업데이트 함수는 아무 작업도 수행하지 않습니다. 이것은 내가 가지고있는 것입니다 :

var counter = 0; 
collection.find({}, { 
    stream: true 
    }) 
    .each(function(doc) { 
    counter++; 
    var hash = geohash.encode(doc.geometry.coordinates[1], doc.geometry.coordinates[0], precision = 9); 
    console.log("id: " + doc._id + " hash: " + hash + " counter= " + counter); 
    collection.update({ 
     _id: doc._id 
     }, { 
     $set: { 
      "properties.geohash.precision9": hash 
     } 
     }, 
     function(err) { 
     if (err) console.log(err); 
     } 
    ); 
    }) 
    .error(function(err) { 
    // handle error 
    console.log(err); 
    }) 
    .success(function(doc) { 
    // final callback 
    console.log("added geohash"); 
    res.send({ 
     objects: doc 
    }); 
    }); 

내가 잘못 했나요?

답변

1

하여 MongoDB에서의 작업 코드는 내가 문제가 선택한 스키마를 믿고 내가 유 승려

+0

을 것은이 방법은 업데이트를 저장하거나이 나 아닌 경우 MongoDB의에서 문서를 삽입 신분증. 따라서 Monk에서는 update 또는 insert 명령을 사용합니다. – justauser

+0

** db.collection.update (item._id, item) **;를 사용할 수 있습니다. – Disposer

1

와 함께 사용할 수있는 몇 가지 작은 변화로 생각

db.collection.find().forEach(function(item) 
{ 
    var hash = ....; 
    item.properties.geohash.precision9 = hash; 
    db.collection.save(item); 
}) 

쉘. 속성은 하위 문서이며 그 안에 저장된 항목은 '.'로 액세스 할 수 있지만 다른 하위 문서 geohash의 속성을 설정하려고합니다. Monk은 매우 가벼운 MongoDB 드라이버이며 많은 수준의 하위 문서를 지원하지 않습니다. 스키마를 다음과 같이 변경하는 것이 좋습니다.

{ 
    "_id": "541a8bea74123744b371d38e", 
    "geometry": { 
    "type": "Point", 
    "coordinates": [ 
    5.3435, 
    51.69554 
    ] 
}, 
"type": "Feature", 
"properties": { 
}, 
"geohash": { 
    "precision9": "somevalue" 
} 
} 

하위 문서를 제거하여 문서 구조를 평탄화하려고합니다. 내 생각에 현재 문서에 대한 정보가 상위 수준에 직접 관련되어 있으므로 속성이라는 하위 문서가 필요하지 않습니다. 내가 당신의 데이터에 대해 이해하지 못한다면. 이 경우 귀하의 데이터베이스에 저장된 문서, 특히 percision9 또는 다른 3 개의 깊은 속성에 대한 값을 가진 문서를 제공하십시오.

당신이 할 수있는 한 가지, 비록 추한, 추가 변수를 사용하여 하위 문서를 작성하고 '해시'값을 할당하고 그 새로운 변수와 동일한 속성을 설정하는 것입니다. 당신이 그것을 제대로 처리하지 않는 한 이것은 이전에 속성에 저장된 것을 덮어 쓰기 :

var newProperties = { 
geohash: { 
    presision9: hash 
} 
} 

collection.update({ 
 
     _id: doc._id 
 
     }, { 
 
     $set: { 
 
      "properties": newProperties 
 
     } 
 
     }, 
 
     function(err) { 
 
     if (err) console.log(err); 
 
     } 
 
    ); 
 
    })

관련 문제