2013-08-20 2 views
2

upsert와 위치 연산자를 함께 사용할 수는 없지만 삽입하려는 객체의 일부 필드가 기존 객체의 일부 필드와 일치하지 않으면 배열에 추가하려고합니다. 배열

그래서 기존 문서가있는 경우 '필드'필드의 값을 확인하고 해당 필드가 일치하면 해당 하위 문서를 업데이트/바꾸기를 원합니다. 그렇지 않으면 간단히 배열에 추가합니다.

{ 
    myArray:[ 
     { 
      field:'xyz' 
     }  
    ] 
} 

node.js에서이를 수행 할 수있는 좋은 방법이 있습니까? 네이티브 드라이버를 사용하고 있습니다.

답변

5

단일 쿼리에서이 작업을 수행 할 수 있다고 생각하지 않습니다. 네이티브 드라이버에서 두 개의 별도 쿼리를 사용하여이 작업을 수행 할 수 있습니다. 첫 번째 쿼리는 배열의 필드를 업데이트하려고합니다. 일치하는 배열에서 문서를 찾지 못하면 두 번째 쿼리를 보내어 문서를 배열에 추가합니다.

db.collection('coll').update({_id: _id, "myArray": {field: "xyz"}}, {"$set": {"myArray.$": {field: "xyzt"}}}, {upsert: true}, function(err, res) { 
    if (err && err.code == 16836) { // no document was matched 
     db.collection('coll').update({_id: _id}, {"$push": {myArray: {field: "xyzt"}}}, function(err, res) { 
      console.log("Inserted document in array"); 
     }); 
    } 
    console.log("Updated document in array"); 
});