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