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

Mongodb 尝试使用pymongo以最有效的方式使用$push进行升级,mongodb,pymongo,Mongodb,Pymongo,我有一个搜索查询,如果它找到一个匹配项,我希望推到它的“VAL”数组上,如果它没有找到匹配项,那么我希望将搜索查询与NewVAL数组一起插入 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的匹配项,则会将ne

我有一个搜索查询,如果它找到一个匹配项,我希望推到它的“VAL”数组上,如果它没有找到匹配项,那么我希望将搜索查询与NewVAL数组一起插入

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]}
我必须这样做数百万次,所以我希望以最理想的方式来做。我也有很多线程同时进入并执行此操作,因此必须担心并发性。上面发布的update语句似乎很有效,但如果找不到匹配项,出于某种原因,它会创建一个类似这样的条目:

{a: 100, b: 250, c: 110, vals: [ [ {x: 1, y: 2}, {x: 4, y:7 ] ]}
请注意数组中的数组


我目前在a、b和c上有一个唯一的组合索引。如果能有所帮助,这是可以改变的。我想我可以在upsert设置为False的情况下进行更新,然后进行插入,如果唯一索引存在,则插入将失败。。。但在这种情况下,我似乎每次搜索都要做两次,这会降低我的效率

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

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