首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >试图以最有效的方式使用pymongo使用$push重新插入

试图以最有效的方式使用pymongo使用$push重新插入
EN

Stack Overflow用户
提问于 2013-12-06 13:39:26
回答 1查看 63关注 0票数 0

我有一个搜索查询,如果它找到了一个匹配项,我想把它推到它的'vals‘数组上,如果它找不到匹配的,那么我想用搜索查询和newVals数组一起做一个插入。

代码语言:javascript
运行
复制
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数组中。

如果没有找到匹配项,我希望它创建如下所示的新记录:

代码语言:javascript
运行
复制
{a: 100, b: 250, c: 110, vals: [{x: 1, y: 2}, {x: 4, y:7]}

我要做几百万次,所以我希望以最优的方式去做。我也有许多线程同时进入并执行此操作,因此必须担心并发性。上面发布的update语句似乎工作正常,但如果找不到匹配项,则会创建这样的条目:

代码语言:javascript
运行
复制
{a: 100, b: 250, c: 110, vals: [ [ {x: 1, y: 2}, {x: 4, y:7 ] ]}

注意数组中的数组..。

目前,我对a、b和c有一个唯一的组合索引。如果它有帮助的话,这可以改变。我想我可以做一个更新,如果一个唯一的索引存在的话,我可以用下面的插入来进行更新.但在这种情况下,我似乎每次搜索都要做两次,而且会扼杀我的效率。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-06 13:49:13

您是否尝试过将$push$each结合使用

代码语言:javascript
运行
复制
collection.update(
    findDict,
    {'$push': {'vals': {'$each': newVals}}},
    upsert = True
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20425357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档