尝试使用pymongo以最有效的方式使用$ push进行upsert

时间:2013-12-06 13:39:27

标签: mongodb pymongo

我有一个搜索查询,如果找到匹配,我想推到它的'vals'数组,如果找不到匹配,那么我想用搜索查询和newVals数组

findDict = {a: 100, b: 250, c: 110}
newVals = [{x: 1, y: 2}, {x: 4, y:7]}

collection.update(findDict,{'$push': {'vals': newVals}}, upsert = True)

在上面的示例中,如果找到了findDict的匹配项,则newVals将被推送到匹配记录的现有vals数组。

如果找不到匹配项,我希望它创建一个如下所示的新记录:

{a: 100, b: 250, c: 110, vals: [{x: 1, y: 2}, {x: 4, y:7]}

我必须做几百万次,所以我希望以最佳的方式做到这一点。我也有很多线程进来并立即执行此操作因此不得不担心并发性。上面发布的更新声明几乎可以正常工作,但如果找不到匹配项,它会因某种原因创建这样的条目:

{a: 100, b: 250, c: 110, vals: [ [ {x: 1, y: 2}, {x: 4, y:7 ] ]}

注意数组中的数组......

我目前在a,b和c上有一个独特的组合索引。如果它有所帮助,可以改变它。我认为我可以使用upsert设置为False进行更新,然后插入如果唯一索引存在则会失败...但是在这种情况下我似乎会进行两次搜索并且会降低我的效率。

1 个答案:

答案 0 :(得分:1)

您是否尝试将$push$each一起使用?

collection.update(
    findDict,
    {'$push': {'vals': {'$each': newVals}}},
    upsert = True
)