我需要帮助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:位置运算符未从查询中找到所需的匹配项。
我无法弄清楚查询出了什么问题。请帮忙。
答案 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]