【发布时间】:2015-11-09 22:19:46
【问题描述】:
给定一个集合,例如:
{
_id: 1,
fruits: [ "apples", "pears", "oranges", "grapes", "bananas" ],
}
{
_id: 2,
fruits: [ "plums", "kiwis", "oranges"],
}
{
_id: 3,
fruits: [ "plums", "kiwis", "oranges", "bananas", "apples" ],
}
我想用“cherries”和“dates”替换所有“bananas”实例。所以结果集合将是:
{
_id: 1,
fruits: [ "apples", "pears", "oranges", "grapes", "cherries", "dates"],
}
{
_id: 2,
fruits: [ "plums", "kiwis", "oranges"],
}
{
_id: 3,
fruits: [ "plums", "kiwis", "oranges", "cherries", "dates", "apples"],
}
我通过pymongo使用过的一种方法:
for document in db.collection.find({'fruits':'bananas'}):
fruits_list = document['fruits']
new_fruits_list = []
for fruit in fruit_list:
if fruit != 'bananas':
new_fruit_list.append(fruit)
else:
for new_fruit in ['cherries','dates']:
new_fruit_list.append(new_fruit)
db.collection.update({'_id' : document['_id']}, {'$set' : {'fruits' : new_fruit_list}})
我正在寻找一种更有效的方法,使用 update 命令 $pull/remove 匹配的元素并使用 $each 修饰符 $push 来插入新元素。但是我很难找到要执行推送操作的数组的 $position。另一个需要注意的是,我想为新水果保留旧水果的位置。即第一个新水果将与旧水果具有相同的位置。
【问题讨论】:
标签: mongodb pymongo pymongo-3.x