mongodb和pymongo中,在多層嵌套數組中插入(更新)符合條件的元素

數據結構是多層嵌套數組:

{
	"_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):

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章