如何查询特定用户的所有文章?

时间:2017-02-03 23:57:11

标签: javascript mongodb mongoose

代码:

服务器侧

     /**
     * 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);
        }
      });
    };

状况:

我上面尝试的内容不起作用。我查看了mongoose文档:http://mongoosejs.com/docs/queries.html

但似乎无法使查询生效。目前,查询只返回任何内容。

问题:

如何查询具有特定displayName的用户的所有文章?

2 个答案:

答案 0 :(得分:1)

TL; DR您无法通过属于已填充对象的字段查询文档。

由于article只有一个refUser,您只需获取所有文章,然后在内存中过滤它们。或者,由于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)。

或者,您始终可以将用户的副本存储为文章文档本身内的非规范化对象,但是您会遇到讨论中非正规化文档同步维护的问题。

答案 1 :(得分: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);
    }
  });
};