2017-02-03 3 views
0

КОД:Как запросить все статьи у конкретного пользователя?

стороне сервера

 /** 
    * List of Articles 
    */ 
    exports.list = function (req, res) { 
     Article.find({ 'user.displayName': 'GIGANTOR !' }).sort('-created').populate('user', 'displayName').exec(function (err, articles) { 
     if (err) { 
      return res.status(422).send({ 
      message: errorHandler.getErrorMessage(err) 
      }); 
     } else { 
      res.json(articles); 
     } 
     }); 
    }; 

СИТУАЦИЯ:

То, что я пытался выше не работает. Я проверил документы в мангусте: http://mongoosejs.com/docs/queries.html

, но не может заставить запрос работать. В настоящее время запрос просто ничего не возвращает.


ВОПРОС:

Как запросить все статьи пользователя с конкретным displayName?

ответ

1

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).

Или вы всегда можете сохранить копию пользователя как отредактированный объект внутри самого документа статьи, но затем вы столкнулись с обсуждаемой проблемой поддержания денормализованных документов в синхронизации.

+0

Благодарим Вас за полный и хорошо организованный ответ. О запросе всех и фильтрации на клиенте: не будет ли это очень неэффективно? Еще одна заметка: я использую mean.js и просто нашел интересный фрагмент кода, который я добавил к моему вопросу. Я просто не уверен, как использовать его для запросов или если он вообще может использоваться для запросов. – Coder1000

+0

Nvm, я заработал! Спасибо за предоставление правильного синтаксиса! – Coder1000

0

Просто поставить код, который я закончил с использованием здесь для людей, которые могли бы в ней нуждается:

/** 
* List of Articles 
*/ 
exports.list = function (req, res) { 
    Article.find({ user: req.user._id.toString() }).sort('-created').populate('user', 'displayName').exec(function (err, articles) { 
    if (err) { 
     return res.status(422).send({ 
     message: errorHandler.getErrorMessage(err) 
     }); 
    } else { 
     res.json(articles); 
    } 
    }); 
}; 
Смежные вопросы