Python 在mongodb的嵌套数组中添加/更新对象

Python 在mongodb的嵌套数组中添加/更新对象,python,mongodb,pymongo,Python,Mongodb,Pymongo,我有一份文件: { "_id": "57d421bbbc44538f0634081c", "in_date": "1473724800", "bboxes": [ { "bbox_index": "4124432432311", "data": {} }, { "bbox_index": "4124435342332", "data": {} }, ... ] } 我正在尝试使用特定的bboxes.bbox\u索引更新在bboxes中找到的整

我有一份文件:

{
  "_id": "57d421bbbc44538f0634081c",
  "in_date": "1473724800",
  "bboxes": [
      { "bbox_index": "4124432432311", "data": {} },
      { "bbox_index": "4124435342332", "data": {} },
      ...
  ]
}
我正在尝试使用特定的
bboxes.bbox\u索引更新在
bboxes
中找到的整个对象:

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_索引”:“4124432432311”,“数据”:{}
被替换为
dict(item)

当具有所需的
bbox\u索引的对象已经存在时,该方法可以正常工作。当它不存在时,我得到
位置操作符没有从查询中找到所需的匹配项。未展开的更新:bboxes。$


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

您可以使用
$addToSet
而不是使用
$push>,它仅在条目尚不存在时才会在数组中插入新条目

要对相关手册页面进行解释,请执行以下操作:

$addToSet运算符向数组中添加一个值,除非该值已经存在,在这种情况下,$addToSet对该数组不做任何操作


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

要对相关手册页面进行解释,请执行以下操作:

$addToSet运算符向数组中添加一个值,除非该值已经存在,在这种情况下,$addToSet对该数组不做任何操作


嗨,凯文,不幸的是,它不是这样工作的。我的意思是,是的,一般来说是这样,但如果您尝试将其用于我的特殊情况,即我需要
upsert
和位置运算符,您将得到
位置运算符没有从查询中找到所需的匹配项。未扩展的更新:bboxes.$
。我明白你的意思
upsert
是为文档级操作而不是子文档级操作创建的,因此它将在文档不存在时更新或插入。您需要的是更深入的对象分析,这目前超出了查询语言的范围,最好在应用程序级别完成。我不这么认为。它只是一个update命令,应该在嵌套数组中插入一个不存在的项。或者在更新时更新。我不明白为什么要在应用程序级别执行此操作。:
upsert boolean可选。如果设置为true,则在没有文档与查询条件匹配时创建新文档。默认值为false,在没有找到匹配项时不会插入新文档。
但是我认为upsert对您不起作用。对于子文档级别,您只有$set、$push或$addToSet,因此您要么创建一个新文档,要么更新一个现有文档。我的意思是,是的,一般来说是这样,但如果您尝试将其用于我的特殊情况,即我需要
upsert
和位置运算符,您将得到
位置运算符没有从查询中找到所需的匹配项。未扩展的更新:bboxes.$
。我明白你的意思
upsert
是为文档级操作而不是子文档级操作创建的,因此它将在文档不存在时更新或插入。您需要的是更深入的对象分析,这目前超出了查询语言的范围,最好在应用程序级别完成。我不这么认为。它只是一个update命令,应该在嵌套数组中插入一个不存在的项。或者在更新时更新。我不明白为什么要在应用程序级别执行此操作。:
upsert boolean可选。如果设置为true,则在没有文档与查询条件匹配时创建新文档。默认值为false,在没有找到匹配项时不会插入新文档。
但是我认为upsert对您不起作用。对于子文档级别,您所拥有的只是$set、$push或$addToSet,因此您要么创建一个新文档,要么更新一个现有文档。