2013-08-01 5 views
1

업데이트 :이 문제에 대한 다른 접근 방법을 제공하는 필자의 대답을 읽는 것이 좋습니다.MongoDB - 배열로 문서 업데이트

다음 컬렉션이 있습니다.

{ 
     "_id" : ObjectId("51fa56408e843042c0c24e3d"), 
     "uniqDates" : [ 
       ISODate("2013-07-30T18:30:00Z"), 
       ISODate("2013-07-31T18:30:00Z") 
     ] 
} 
{ 
     "_id" : ObjectId("51fa5648c424ea3e37199502"), 
     "events" : [ 
       { 
         "eid" : 1, 
         "title" : "Event 1", 
         "start" : ISODate("2013-08-04T18:30:00Z") 
       }, 
       { 
         "eid" : 2, 
         "title" : "Event 2", 
         "start" : ISODate("2013-08-08T18:30:00Z") 
       } 
     ] 
} 

내가 존재하는 경우 (내가 아이드하여 확인 할) "이벤트"배열에서 문서를 업데이트 할, 그렇지 않은 존재 않으면 내가 그 문서를 삽입 할.

현재 두 개의 쿼리로이 작업을 수행하고 있습니다.

db.col.update({events: {$exists: 1}}, {$pull: {"events": {"eid": 2}}}); 

db.schedule.update({events: {$exists: 1}}, {$addToSet: 
{"events": {"eid": 2, "title": "Event 4", "start": new Date(2013, 08, 02)}}}); 

단일 쿼리로 이것을 할 수있는 방법이 있나요? upsert 작동으로 뭔가가 있습니다.

+0

가능한 복제본 : http://stackoverflow.com/questions/3135927/mongodb-upsert-involving-lists – jsalonen

답변

0

UPDATE
그룹 문서에 위와 같이 수집을 가지고 매우 명백 사고 방식이다. 그러나 배열로 된 문서는 다른 문제를 일으킬 수 있습니다. 각 문서를 업데이트하려면 Array Update 운영자에게 문의하십시오. 대신, 나는 아래와 같이 나의 수집을 재구성했다. 또한 google group discussion을 참조하십시오. 거기에 지정된 "idbentley"로 은 문서 크기 제한 (16MB)을 초과 할 가능성이 있으며 은 데이터 조각화로 이어집니다. 따라서 데이터를 모델링하는 동안 의식을 유지하십시오. 이 문서 배열에 upsert 작업을 달성하는 것은 불가능처럼

원래 답변

보인다. 그래서 내 스키마 디자인이 아래와 같이 변경되었습니다.

{ 
     "_id" : ObjectId("51fa619a8e843042c0c24e46"), 
     "uniqDates" : [ 
       ISODate("2013-07-30T18:30:00Z"), 
       ISODate("2013-07-31T18:30:00Z") 
     ] 
} 
{ 
     "_id" : ObjectId("51fa61b38e843042c0c24e47"), 
     "eid" : 1, 
     "title" : "Event 1", 
     "start" : ISODate("2013-08-04T18:30:00Z") 
} 
{ 
     "_id" : ObjectId("51fa61b38e843042c0c24e48"), 
     "eid" : 2, 
     "title" : "Event 2", 
     "start" : ISODate("2013-08-08T18:30:00Z") 
} 

이벤트를 확인하는 방법은 다음과 같습니다

db.schedule.find({"eid": {$exists: 1}}); 

고유 날짜를 찾으려면 :

db.schedule.find({"uniqDates": {$exists: 1}}); 

를 달성하기 위해 'upsert'운영 :

db.schedule.update({"eid": 3}, {"eid": 3, "title": "Event 3", 
           "start": new Date(2013, 05, 06)}, true); 

이 유망 보인다.

1

두 쿼리를 사용하여이 작업을 수행해야합니다. 그러나 $ query ~ update을 사용하면 EID가 이미있는 경우 하나의 쿼리로 유지할 수 있습니다. 그 반환 값이 더 기록이 발견되지 않음을 나타내는 경우

db.col.update({"events.eid": 2}}, {$set: {"events.$.title: "Event 4", "events.$.start": new Date(2013, 08, 02}}) 

, 당신은 대신을 삽입 할 수 있습니다.

+0

답장 @paul. 감사. – user10

관련 문제