我正在學習 MongoDB 并且我一直在嘗試更新嵌套的歌曲陣列,但是,位置運算子似乎正在更新錯誤的索引。
這是資料庫中檔案的結構:
{
'_id': ObjectId(...),
'artistName': Artist Name,
'recordLabel': Label Name,
'genre': Genre,
'albums': [
{
'albumName': Album 1
'songs': [ Song 1, Song 2]
},
{
'albumName': Album 2
'songs': [ Song 3, Song 4]
},
]
}
這是我嘗試執行的 update_one() 函式:
artistcol.update_one(
{ 'albums.songs': 'Song 2' },
{ '$set': { 'albums.$[name].songs.$': 'Test 1' }},
array_filters=[{ 'name.albumName': 'Album 1' }]
)
execute 函式中的值是從表單中引入的,但我只是對這篇文章的值進行了硬編碼。
期望:
基于上面的查詢,我正在尋找一個具有“歌曲 2”的物件,然后使用陣列過濾器獲取其所在的正確專輯物件,然后使用位置運算子獲取歌曲的索引并更改值到“測驗 1”。
如果我通過參考資料庫對專輯索引和歌曲索引進行硬編碼,但我需要它們是動態的,因為用戶將選擇專輯、歌曲標題,然后為歌曲提供新值。
實際:
查詢完成后,“Song 1”已更新為“Test 1”而不是“Song 2”。
如果我要嘗試:
artistcol.update_one(
{ 'albums.songs': 'Song 3' },
{ '$set': { 'albums.$[name].songs.$': 'Test 2' }},
array_filters=[{ 'name.albumName': 'Album 2' }]
)
它會將“歌曲 4”更新為“測驗 2”。
到目前為止我的理解:
似乎無論過濾器查詢找到什么索引,位置運算子 ($) 都指的是同一個索引。
我唯一需要弄清楚的是如何定位歌曲中的特定陣列元素并將其值更改為用戶輸入的任何內容。
我瀏覽了很多關于 MongoDB 的檔案,試圖盡可能地理解,并嘗試了不同的東西,但我沒有任何運氣。
任何幫助將不勝感激,我不知道從哪里開始。:)
uj5u.com熱心網友回復:
位置運算子將參考與查詢匹配的頂級陣列中的第一個元素。
在問題中的查詢中,$指的是匹配的專輯,即
{
'albumName': Album 1
'songs': [ Song 1, Song 2]
},
使用陣列過濾器選擇嵌套陣列的元素,如:
.update(
{"albums.songs": "Song 2"},
{$set: {"albums.$.songs.$[song]": "Tested"}},
{arrayFilters: [{song: "Song 2"}]
})
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/361793.html
