我需要在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
}
}
},
)
即使评论sort
和slice
,push
操作也不会保留旧操作。
该过程在scrapy 0.24.4管道,PyMongo版本2.7.1,Mongo版本2.6.4中运行
解决问题:在这些代码丢失所有数据之前,我在其他功能中使用find_and_modify
答案 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