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
}
}
},
)
甚至评论说 sort
和 slice
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
我需要在 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
}
}
},
)
甚至评论说 sort
和 slice
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