我有一份文件:
{
"_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
完全是出于此目的。有什么办法可以做我想要的吗?
答案 0 :(得分:0)
您可以使用$push
而不是使用$addToSet
,只有当条目尚不存在时才会在数组中插入新条目。
解释相关手册页https://docs.mongodb.com/manual/reference/operator/update/addToSet/:
$ addToSet 运算符会向数组添加值,除非该值已存在,在这种情况下, $ addToSet 对该数组不执行任何操作。