MongoDB: добавление поля к объекту поля массива на основе значения поля в объекте - PullRequest
2 голосов
/ 11 января 2020

Мне нужна помощь 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
                 }
        }
    }

Это дает мне следующее исключение: pymon go .errors.WriteError: Оператор положения не нашел нужного соответствия в запросе.

Я не могу понять, что не так с запросом. Пожалуйста, помогите.

1 Ответ

0 голосов
/ 12 января 2020

Я получил запрос, работающий так:

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

    }

Это работает, даже если поле не существует. Если он существует, он перезаписывает существующее значение поля. Обратите внимание: если я хочу создать какой-либо фильтр запросов, включающий элементы поля массива, в фильтрующей части обновления требуется $ elemMatch.

Кроме того, я экспериментировал с «$ addToSet» вместо "$ набор". Создает массив значений под полем.

PlayPosition: 15  #with "$set"

PlayPosition: #with "$addToSet"
[15]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...