2017-12-07 1 views
0

은 내가 MongoDB의 문서에 중첩 다음과 같은 시계열 배열 ("데이터"라는 이름의)를 가지고MongoDB timeseries 배열을 중복없이 올바르게 업데이트하는 방법은 무엇입니까?

"_id" : ObjectId("5a235e645bb1000704593960"), 
"data" : [ 
    { 
     "Volume" : NumberLong(41527200), 
     "Adj Close" : 171.850006, 
     "High" : 172.139999, 
     "Low" : 168.440002, 
     "Date" : ISODate("2017-11-30T00:00:00.000+0000"), 
     "Close" : 171.850006, 
     "Open" : 170.429993 
    }, 
    { 
     "Volume" : NumberLong(39726100), 
     "Adj Close" : 171.050003, 
     "High" : 171.669998, 
     "Low" : 168.5, 
     "Date" : ISODate("2017-12-01T00:00:00.000+0000"), 
     "Close" : 171.050003, 
     "Open" : 169.949997 
    }, 
    { 
     "Volume" : NumberLong(39759300), 
     "Adj Close" : 171.050003, 
     "High" : 171.669998, 
     "Low" : 168.5, 
     "Date" : ISODate("2017-12-01T00:00:00.000+0000"), 
     "Close" : 171.050003, 
      "Open" : 169.949997 
     }, 

    ], 
    "ticker" : "AAPL", 
    "last_update" : ISODate("2017-12-07T00:00:00.000+0000") 
} 

내 문제는 내가 시계열을 업데이트 할 때, 주어진 날짜에 대한 몇 가지 배열 요소가 변경 될 수 있다는 점이다. 예를 들어, 배열에는 2017-12-01에 대해 2 개의 레코드가 있습니다. "볼륨"을 제외한 모든 필드가 동일합니다. 그러나 배열을 업데이트하면 기존 2017-01-01 레코드를 업데이트하는 대신 배열에 새 레코드가 추가됩니다.

나는 현재와 문서를 업데이트하고 다음

self.__db.equity_data.update({'ticker': ticker, 
           'last_update': {'$lt': record['last_update']}}, 
          {'$set': {'last_update':record['last_update']}, 
           '$addToSet': {'data': {'$each': record['data']}}}, 
           upsert=True 
           ) 

내가 (날짜 기준) 중복 항목이 배열에 추가되지 않도록하고, 대신에 업데이트 할 수있는 방법이됩니다 기존의 배열 요소?

도움 주셔서 감사합니다.

답변

0

나는 pymongo에 익숙하지 않지만 upsert 플래그를 false으로 설정하려고 시도 했습니까? 나머지 명령문이 올 바르면 이전 문서를 갱신하는 대신 새 문서를 작성하지 않아야합니다. 또한 위의 코드는 기본적으로 하나의 문서 만 업데이트하므로 multi 플래그를 추가해야합니다. 행운을 빈다!

+0

응답 해 주셔서 감사합니다. 나는 upsert가 문서 수준에 적용된다고 생각한다. 배열 수준입니다. 나는 틀린 것일지도 모른다. upsert = False로 시도했지만 원하는 결과를 얻지 못했습니다. –

관련 문제