2017-02-03 18 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); 
    } 
    }); 
}; 
相關問題