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,因此您要么创建一个新文档,要么更新一个现有文档。