【问题标题】:Trying to do an upsert with a $push in the most efficient manner using pymongo尝试使用 pymongo 以最有效的方式使用 $push 进行 upsert
【发布时间】: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 进行更新,然后进行插入,如果存在唯一索引,该插入将失败……但在这种情况下,我似乎会进行两次搜索并降低我的效率。

【问题讨论】:

    标签: mongodb pymongo


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-17
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多