TL; DR Вы не можете запросить документ по полю, принадлежащему населенному объекту.
С article
просто имеет ref
до User
, вы получите только все статьи, а затем отфильтровываете их в памяти. Или, поскольку поле article.user
является _id
, вы можете найти статьи по ID пользователя (но ваш вопрос задает вопрос об их поиске по user.displayName
).
Mongoose populate
делает не делает заселение на сервере MongoDB; он заполняется на сервере приложений. Это означает, что происходит многократная обратная связь с базой данных (см. Статью Understanding Mongoose Population.) Поэтому вы не можете запрашивать поле, которое существует как часть заполненного объекта.
Итак, вот ваши 2 решения:
Article.find({}).sort('-created').populate('user', 'displayName').exec(function (err, articles) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
let filteredArticles = articles
.filter(article => article.user.displayName === 'GIGANTOR !');
res.json(filteredArticles);
}
});
Или, если вы можете запросить по _id
, вы можете сделать это:
Article.find({ user: 'somemongoobjectidofuser' }).sort('-created').populate('user', 'displayName').exec(function (err, articles) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(articles);
}
});
Это добирается, чтобы быть немного волосатые и из сферы вопроса, но другое решение - aggregation pipeline, которое обычно рекомендуется только для анализа бэкэнд. Но это обеспечит вам большую гибкость в вашем запросе (особенно если вы используете пользователь MongoDB $graphLookup
).
Или вы всегда можете сохранить копию пользователя как отредактированный объект внутри самого документа статьи, но затем вы столкнулись с обсуждаемой проблемой поддержания денормализованных документов в синхронизации.
Благодарим Вас за полный и хорошо организованный ответ. О запросе всех и фильтрации на клиенте: не будет ли это очень неэффективно? Еще одна заметка: я использую mean.js и просто нашел интересный фрагмент кода, который я добавил к моему вопросу. Я просто не уверен, как использовать его для запросов или если он вообще может использоваться для запросов. – Coder1000
Nvm, я заработал! Спасибо за предоставление правильного синтаксиса! – Coder1000