如何正确更新没有重复的MongoDB时间序列数组?

时间:2017-12-07 06:23:01

标签: python mongodb time-series pymongo

我有以下timeseries数组(名为“data”),嵌套在mongodb文档中:

"_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
                                 )

有什么方法可以确保不会将重复的项目(基于日期)添加到数组中,而是更新现有的数组元素?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我对pymongo不熟悉,但您是否尝试将upsert标记设为false?如果其他语句正确,它应该阻止创建新文档而不是更新旧文档。此外,您应该尝试添加multi标志,因为上述代码默认只更新一个文档。 祝你好运!