我有一个搜索查询,如果它找到了一个匹配项,我想把它推到它的'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]}我要做几百万次,所以我希望以最优的方式去做。我也有许多线程同时进入并执行此操作,因此必须担心并发性。上面发布的update语句似乎工作正常,但如果找不到匹配项,则会创建这样的条目:
{a: 100, b: 250, c: 110, vals: [ [ {x: 1, y: 2}, {x: 4, y:7 ] ]}注意数组中的数组..。
目前,我对a、b和c有一个唯一的组合索引。如果它有帮助的话,这可以改变。我想我可以做一个更新,如果一个唯一的索引存在的话,我可以用下面的插入来进行更新.但在这种情况下,我似乎每次搜索都要做两次,而且会扼杀我的效率。
发布于 2013-12-06 13:49:13
您是否尝试过将$push与$each结合使用
collection.update(
findDict,
{'$push': {'vals': {'$each': newVals}}},
upsert = True
)https://stackoverflow.com/questions/20425357
复制相似问题