2017-02-03 7 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); 
     } 
     }); 
    }; 

SITUATION:私は動作しません上記試してみました何

。私はmongooseのドキュメントをチェックしました:http://mongoosejs.com/docs/queries.html

しかし、クエリを動作させるように見えることはできません。現在、クエリは何も返しません。


QUESTION:

特定displayNameでユーザーによってすべての記事を照会する方法は?

答えて

1

TL; DR入力されたオブジェクトに属するフィールドでドキュメントを照会することはできません。

にはrefUserが含まれているため、すべての記事を取得してメモリにフィルタリングするだけです。または、article.userフィールドが_idであるため、ユーザー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); 
    } 
    }); 

それは少し毛深いと範囲外となりますもう1つの解決策は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); 
    } 
    }); 
}; 
関連する問題