Mongodb 使用 pymongo 和 $push 执行清理列表

Mongodb with pymongo and $push performing cleaning the list

我需要在 MongoDB 的列表中添加一个 dict,按日期排序并删除旧的。

当 运行 直接在 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
            }
        }
    },
)

甚至评论说 sortslice push 操作没有维护旧的。

进程是运行在scrapy 0.24.4 pipeline, PyMongo Version 2.7.1, Mongo Version 2.6.4


问题已解决:在那些代码丢失所有数据

之前,我在其他函数中使用了find_and_modify

你的代码适用于 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