MongoDB запрос в массив массивов

У меня есть следующая схема в моей БД:

{ name: 'AFG',
  documents: [
    { name: 'doc1',
      templates: [
        { name: 'templ1',
          lastModified: <Date>},
        ...]
    },
    ...]
}

Я пытаюсь сделать запрос для поиска шаблона с именем 'templ1'. Если я нахожу это, я должен сравнить дату последнего изменения с другим и обновить значение. Если я не нахожу это, я должен вставить это в массив.

Я попытался сделать это с помощью следующего запроса:

Country.findOne({name : countrySelected, documents : {$elemMatch: {name: documentSelected}}, 'documents.templates' : {$elemMatch: {name: templateSelected}}}, function(err, templateFound){...}

Но я получаю следующую ошибку:

MongoError: cannot use the part (documents of documents.templates) to traverse the element ({documents: [ { name: "Passport", templates: [] }, { name: "Visa", templates: [] }, { name: "Driver's Licence", templates: [] }, { name: "Id Card", templates: [] }, { name: "Other", templates: [] } ]})

Кто-то знает, как я могу это сделать? Спасибо!!

1 ответ

Вы должны использовать $in Оператор для поиска в массивах.

Country.findOne({
    name : countrySelected, 
    documents: {
        $elemMatch: {
            $and: [{
                name: {
                    $in: documentSelected //<-- must be array like ['doc1']
                }
            }, {
                'templates.name': {
                    $in: documentSelected //<-- must be array like ['tmpl1']
                 }
            }]
        }
    }
}, function(err, templateFound){
    //do something with err and templateFound
});

Для обновления даты LastModified вам необходимо обновить ее в функции обратного вызова и сохранить документ.

Смотрите этот ответ для обновления вложенных массивов

Другие вопросы по тегам