2017-02-03 23 views
0

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

服务器端

 /** 
    * 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只是一个refUser,您只需获取所有文章,然后在内存中对其进行过滤。或者,由于article.user字段为_id,因此您可以通过用户标识查找文章(但您的问题是通过user.displayName查询)。

猫鼬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); 
    } 
    }); 
}; 
相关问题