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 вам необходимо обновить ее в функции обратного вызова и сохранить документ.