數據結構是多層嵌套數組:
{
"_id" : ObjectId("5de0c88a0f158bf0f60ff99a"),
"province" : "陝西",
"cityAndData" : [
{
"city" : "西安",
"districtAndData" : [
{
"district" : "長安",
"dateTimeAndData" : []
},
{
"district" : "臨潼",
"dateTimeAndData" : []
}
]
},
{
"city" : "咸陽",
"districtAndData" : [
{
"district" : "咸陽",
"dateTimeAndData" : []
},
{
"district" : "三原",
"dateTimeAndData" : []
}
}
]
}
需求:找出陝西省西安市長安區的dateTimeAndData屬性中,插入一條數據 'mydata'
在mongodb shell中:
$[<identifier>]和arrayFilters配合起來使用,$[c]是佔位符,意思是在cityAndData數組的元素中,找到滿足arrayFilters中對應過濾條件的元素,參考mongodb-identifier,注意要求mongodb版本號3.6及以上。如下,就能將'mydata'插入到dateTimeAndData中
db.weather.update(
{'province':'陝西','cityAndData.city':'西安','cityAndData.districtAndData.district':'長安'},
{$push: {"cityAndData.$[c].districtAndData.$[d].dateTimeAndData":'mydata'}},
{arrayFilters:[{'c.city':'西安'},{'d.district':'長安'}],upsert:false})
在pymongo中:
update方法已經逐漸廢棄了。最好用update_one或者update_many,取決於你想更新一條還是多條符合條件的記錄
self.mycol.update_one(
dataUpdateQuery,
{'$push'{'cityAndData.$[c].districtAndData.$[d].dateTimeAndData': dateTimeAndData}},
upsert=False,
array_filters=[{'c.city':city},{'d.district':district}])
爲了看清楚分了幾行寫,注意upsert=False,不要用“:”代替“=”;array_filters也是作爲參數出現的,不要加“”
其實看看官網的api就一目瞭然了(參考pymongo-update_one):