MongoDB 使用 python 和 pymongo 的位置运算符索引问题

MongoDB positional operators index issue using python and pymongo

我正在学习 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 函数中的值是从表单中引入的,但我只是硬编码了此 post 的值。

期待:
根据上面的查询,我正在寻找具有 'Song 2' 的 object,然后使用数组过滤器获取正确的 专辑 object它在然后是位置运算符以获取歌曲的 index 并将值更改为 'Test 1'.

如果我通过引用数据库对专辑索引和歌曲索引进行硬编码,但我需要它们是动态的,因为用户将 select 专辑、歌曲标题,然后为歌曲。

实际:
查询完成后,'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' }]
  )

它会将 'Song 4' 更新为 'Test 2'。

目前我所了解的内容:
似乎无论过滤器查询找到什么索引,位置运算符 ($) 都指向相同的索引。

我唯一需要弄清楚的是如何定位歌曲中的特定数组元素并将其值更改为用户输入的值。

我查看了 MongoDB 的大量文档,尽我所能去理解,并尝试了不同的东西,但我没有任何运气。

任何帮助将不胜感激,我不知道从这里去哪里。 :)

位置运算符将引用与查询匹配的顶级数组中的第一个元素。

在问题的查询中,$指的是匹配的相册,即

 {
     'albumName': Album 1
     'songs': [ Song 1, Song 2]
 }, 

使用数组过滤器select嵌套数组的元素,如:

.update(
  {"albums.songs": "Song 2"},
  {$set: {"albums.$.songs.$[song]": "Tested"}},
  {arrayFilters: [{song: "Song 2"}]
})

Playground