Mongodb与pymongo和$ push执行清理清单

时间:2015-01-16 13:00:10

标签: python mongodb pymongo

我需要在MongoDB的列表中添加一个dict,按日期排序并剪切旧的。{/ p>

以下代码在MongoDB中直接运行时使用robomongo客户端完美地完成了这项工作:

db.products.update(
    { _id: ObjectId("549598b641ba00e6b7aacd45") },
    {
        $push: {
            prices: {
                $each: [{'d': ISODate("2015-01-13T01:13:00.201Z"), 'v': 105.3}],
                $sort: {'d': -1},
                $slice: -30
            }
        }
    }
)

但是当我在PyMongo中重写操作并执行时,它首先清除旧数组并添加新数组,留下一条记录。

PyMongo代码:

self.db['products'].update(
    {'source_url': item['source_url']},
    {
        '$push': {
            'prices': {
                '$each': [{'d': datetime.utcnow(), 'v': 107.8}],
                # '$sort': {'d': -1},
                # '$slice': -30
            }
        }
    },
)

即使评论sortslicepush操作也不会保留旧操作。

该过程在scrapy 0.24.4管道,PyMongo版本2.7.1,Mongo版本2.6.4中运行


解决问题:在这些代码丢失所有数据之前,我在其他功能中使用find_and_modify

1 个答案:

答案 0 :(得分:0)

您的代码适用于PyMongo:

>>> db = MongoClient().test
>>> db.products.insert({'source_url': 'x'})
ObjectId('54ba45a6ca1ce9489f5778b2')
>>> from datetime import datetime
>>> db.products.update({'source_url': 'x'}, {'$push': {
            'prices': {
                '$each': [{'d': datetime.utcnow(), 'v': 107.8}]}}})
>>> len(db.products.find_one()['prices'])
1
>>> db.products.update({'source_url': 'x'}, {'$push': {
            'prices': {
                '$each': [{'d': datetime.utcnow(), 'v': 107.8}]}}})
>>> len(db.products.find_one()['prices'])
2