新手使用django操作mongodb 数据库遇到嵌套多层的数组元素 。
$ 位置操作符只能使用一次,多次嵌套需要使用arrayFilters 。
写出mongodb sql可以执行但是 python代码中总是以下几个错误报错来来回回:
1、Too many positional (i.e. '$') elements found in path '
2、array_filters must be a list
3、got multiple values for argument 'upsert'
4、upsert must be True or False
sql如下:
db.po.updateMany({"orderItems.waybills.platorder":"2072881765951620035"},
{"$set":{"orderItems.$.waybills.$[idx2].expressId":"YT5763695957631"}},
{ "arrayFilters": [{ "idx2.platorder": "2072881765951620035" }]},{"upsert":true})
我的代码(错误的!!)
db.po.update({'orderItems.waybills.platorder': '2072881765951620035'},
{'$set': {'orderItems.$.waybills.$[idx1].expressId': 'YT5763695957631'}},
{'arrayFilters': [{'idx1.platorder': '2072881765951620035'}], "multi": True})
最后查看pymongodb 源代码发现sql中的"arrayFilters:"要替换成"array_filters=",如下:
def update_many(self, filter, update, upsert=False, array_filters=None,
bypass_document_validation=False, collation=None,
hint=None, session=None):
更改如下:
db.po.update_many({"orderItems.waybills.platorder": "2072881765951620035"},
{"$set": {"orderItems.$.waybills.$[idx2].expressId": "YT5763695957631"}},
upsert=False,
array_filters=[{"idx2.platorder": "2072881765951620035"}])
头大一下午,不是多高深,记下来备忘使用。。