我有一个搜索查询,如果找到匹配,我想推到它的'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进行更新,然后插入如果唯一索引存在则会失败...但是在这种情况下我似乎会进行两次搜索并且会降低我的效率。
答案 0 :(得分:1)
您是否尝试将$push
与$each
一起使用?
collection.update(
findDict,
{'$push': {'vals': {'$each': newVals}}},
upsert = True
)