MongoDB:根据对象中的字段值将字段添加到数组字段对象

时间:2020-01-11 10:34:36

标签: python-3.x mongodb-query pymongo

我需要帮助mongoDB查询。这是我的收藏。 mongodb中的播放列表

 JukeBox Collection
{
[
roomName : 'room1',
playlist :

[{ Filename: 'file1.mp3',
   Filekeywords: 'party music, couples'
},
{ Filename: 'file2.mp3',
  Filekeywords: 'fine dining, family , kids'
},
{ Filename: 'file1.mp3',
  Filekeywords: 'elderly, family'
}]
},
roomName : 'room2',
playlist : [{
...
}...
]
}

我需要将一个字段插入到数组字段“ PlayPosition:15 #seconds”的一个对象中,如果文件名与对象字段中指定的文件名匹配。更新后的预期集合:

JukeBox Collection
{
[
roomName : 'room1',
playlist :

[{ Filename: 'file1.mp3',
   Filekeywords: 'party music, couples',

},
{ 
   Filename: 'file2.mp3',
   Filekeywords: 'fine dining, family,kids'   
   PlayPosition: 15 #seconds
},
{ Filename: 'file1.mp3',
  Filekeywords: 'elderly, family', 

}]

我想遍历数组字段,找到匹配的字段(文件名),然后插入“ PlayPosition”键+值(如果不存在)。如果存在,则应更新该字段。我的假设是我需要使用update_one,我应该使用“ $ addToSet”来实现这一点。我的效用函数如下:

UpdateCurrentPlayStatus(filename = "file2.mp3", position_in_seconds=15):

   #What should be my query?
   JukeBoxUpdate( {roomName: 'room1'}, 
    { 
        "$addToSet":{ 
            "playlist.$": {
                 "Filename": filename,#file2.mp3 . Does this filter 
                 "PlayPosition": position_in_seconds
                 }
        }
    }

它给了我以下异常: pymongo.errors.WriteError:位置运算符未从查询中找到所需的匹配项。

我无法弄清楚查询出了什么问题。请帮忙。

1 个答案:

答案 0 :(得分:0)

我使查询像这样工作。

JukeBox.update_one( {roomName: 'room1', "playlist":{"$elemMatch":{"Filename": filename}} }, 
    { 
        "$set":{ 
            "LessonList.$.PlayPosition": position_in_seconds
            }

    }

即使该字段不存在,此方法也有效。如果存在,它将覆盖现有字段值。 需要注意的是-如果我要创建涉及数组字段元素的任何查询过滤器,则在更新的过滤器部分中必须使用$ elemMatch。

此外,我尝试了“ $ addToSet”而不是“ $ set”。它在该字段下创建值数组。

PlayPosition: 15  #with "$set"

PlayPosition: #with "$addToSet"
[15]