TL; DR入力されたオブジェクトに属するフィールドでドキュメントを照会することはできません。
にはref
〜User
が含まれているため、すべての記事を取得してメモリにフィルタリングするだけです。または、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
を使用している場合)。
それとも、あなたは常に、記事の文書自体の内部非正規化オブジェクトとしてユーザーのコピーを保存することができますが、その後、あなたが同期非正規化のドキュメントを維持することの大いに議論問題が発生しました。ちょうど私がそれを必要とすることができる人々のために、ここで使用して終了コード置く
はあなたの完全な、よく組織化の答えをいただき、ありがとうございます。すべてのクエリとクライアントのフィルタリングについて:非常に非効率的ではないでしょうか?別のノートでは:私はmean.jsを使用しているだけで、私は自分の質問に追加した興味深いコードを見つけました。私はそれをどのようにクエリに使うのか、あるいはクエリに使うことができるのかどうかは分かりません。 – Coder1000
Nvm、私はそれが働いている!正しい構文を提供していただきありがとうございます! – Coder1000