あなたが例えば「MongoDBは」または「ノードJS」は任意のタグを持つすべての人のために検索したい場合は、あなたは、
var query = mongoose.model("person").find({ "name": "foo" }).populate("projects.tags");
ようpopulate()
機能を利用することができpopulate()
機能過負荷でのクエリオプションを含めることができます。
var query = mongoose.model("person").find({ "name": "foo" }).populate({
"path": "projects.tags",
"match": { "en": { "$in": ["MongoDB", "Node JS"] } }
});
あなたはすべてのタグは、すべての人のために"project.tags"
に存在する場合は、アグリゲーション・フレームワークが道のりです。その後、フィルタリングする最初のステップとして$match
パイプラインを適用
mongoose.model('person').aggregate([
{ "$unwind": "$projects" },
{ "$unwind": "$projects.tags" },
{
"$lookup": {
"from": "tags",
"localField": "projects.tags",
"foreignField": "_id",
"as": "resultingTagsArray"
}
},
{ "$unwind": "$resultingTagsArray" },
{
"$group": {
"_id": null,
"allTags": { "$addToSet": "$resultingTagsArray" },
"count": { "$sum": 1 }
}
}
]).exec(function(err, results){
console.log(results);
})
いかなる特定の人のために:人のコレクションで、このパイプラインを実行することを検討し、タグのコレクションに参加し、左を行うために$lookup
演算子を使用していますドキュメント:
mongoose.model('person').aggregate([
{ "$match": { "name": "foo" } },
{ "$unwind": "$projects" },
{ "$unwind": "$projects.tags" },
{
"$lookup": {
"from": "tags",
"localField": "projects.tags",
"foreignField": "_id",
"as": "resultingTagsArray"
}
},
{ "$unwind": "$resultingTagsArray" },
{
"$group": {
"_id": null,
"allTags": { "$addToSet": "$resultingTagsArray" },
"count": { "$sum": 1 }
}
}
]).exec(function(err, results){
console.log(results);
})
別の回避策を使用すると、MongoDBのバージョンを使用している場合> = 2.6または< =あなたが特定の人のために全体のアプリケーションのすべてのタグまたはすべてのタグをしたい
mongoose.model('person').aggregate([
{ "$unwind": "$projects" },
{ "$unwind": "$projects.tags" },
{
"$group": {
"_id": null,
"allTags": { "$addToSet": "$projects.tags" }
}
}
], function(err, result) {
mongoose.model('person')
.populate(result, { "path": "allTags" }, function(err, results) {
if (err) throw err;
console.log(JSON.stringify(results, undefined, 4));
});
});
:
$lookup
演算子をサポートしていない3.0として集計の結果を移入するのですか? 人に関係なく、すべてのタグを一覧表示する場合は、タグコレクションを直接照会することができます。 –私はアプリケーション全体でタグを使いたいです。すべての人物のproject.tagsに存在するすべてのタグ。 – Per