在mongodb中将对象添加/更新到嵌套数组中

时间:2016-09-10 15:31:29

标签: python mongodb pymongo

我有一份文件:

{
  "_id": "57d421bbbc44538f0634081c",
  "in_date": "1473724800",
  "bboxes": [
      { "bbox_index": "4124432432311", "data": {} },
      { "bbox_index": "4124435342332", "data": {} },
      ...
  ]
}

我尝试使用特定bboxes更新bboxes.bbox_index中找到的整个对象:

bbox_index = 4124432432311
in_date = 1473724800

self.db['my_table'].update(
    {
        'in_date': in_date,
        'bboxes.bbox_index': bbox_index
    }, 
    {
        '$set': {'bboxes.$': dict(item)}
    },
    upsert=True
)

我希望将此对象{ "bbox_index": "4124432432311", "data": {} }替换为dict(item)

当已存在所需bbox_index的对象时,此方法正常。如果它不存在,我会得到The positional operator did not find the match needed from the query. Unexpanded update: bboxes.$

为了使其工作,我必须执行相同的查询,而不是$set执行{'$push': {'bboxes': dict(item)}}。当然,当我在数据库中已经有必需的对象时,这并不能很好地工作。在这种情况下,我再次推动相同的对象。可能的解决方案是在更新之前检查对象,但我想在一个单独的表达式中进行。我认为upsert=True完全是出于此目的。有什么办法可以做我想要的吗?

1 个答案:

答案 0 :(得分:0)

您可以使用$push而不是使用$addToSet,只有当条目尚不存在时才会在数组中插入新条目。

解释相关手册页https://docs.mongodb.com/manual/reference/operator/update/addToSet/

  

$ addToSet 运算符会向数组添加值,除非该值已存在,在这种情况下, $ addToSet 对该数组不执行任何操作。