2017-12-07 12 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に設定しようとしましたか?残りのステートメントが正しい場合は、古い文書を更新するのではなく、新しい文書を作成しないようにする必要があります。また、上記のコードはデフォルトで1つのドキュメントのみを更新するため、multiフラグを追加してください。 幸運を祈る!

+0

お返事ありがとうございます。アップレベルはドキュメントレベルに適用されます。これは配列レベルにあります。私は間違っているかもしれません。私はupsert = Falseを試しましたが、これは望みの結果を生成しませんでした。 –

関連する問題