【发布时间】:2013-12-23 21:22:09
【问题描述】:
我有一个搜索查询,如果它找到匹配项,我想推入它的“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 进行更新,然后进行插入,如果存在唯一索引,该插入将失败……但在这种情况下,我似乎会进行两次搜索并降低我的效率。
【问题讨论】: