Joe*_*Joe 8 mongoose mongodb mongodb-query aggregation-framework
有两个收藏,标签和人.
标签型号:
{
en: String,
sv: String
}
Run Code Online (Sandbox Code Playgroud)
人物模型:
{
name: String,
projects: [
title: String,
tags: [
{
type: Schema.ObjectId,
ref: 'tag'
}
]
]
}
Run Code Online (Sandbox Code Playgroud)
我想查询返回人员模型中使用的所有标签.所有文件.
有点喜欢
var query = mongoose.model('tag').find({...});
Run Code Online (Sandbox Code Playgroud)
或者我应该以某种方式使用聚合方法?
chr*_*dam 36
对于任何特定人员文档,您可以使用populate()类似的功能
var query = mongoose.model("person").find({ "name": "foo" }).populate("projects.tags");
Run Code Online (Sandbox Code Playgroud)
如果你想搜索任何有'MongoDB'或'Node JS'标签的人,你可以在populate()函数重载中包含查询选项:
var query = mongoose.model("person").find({ "name": "foo" }).populate({
"path": "projects.tags",
"match": { "en": { "$in": ["MongoDB", "Node JS"] } }
});
Run Code Online (Sandbox Code Playgroud)
如果您希望所有人都拥有所有标签"project.tags",那么聚合框架就是您的选择.考虑在person集合上运行此管道,并使用$lookup运算符在tags集合上执行左连接:
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);
})
Run Code Online (Sandbox Code Playgroud)
对于任何特定的人,然后应用$match管道作为筛选文档的第一步:
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);
})
Run Code Online (Sandbox Code Playgroud)
如果您使用不支持$lookup运算符的MongoDB版本> = 2.6或<= 3.0,则另一种解决方法是将聚合的结果填充为:
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 ));
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28465 次 |
| 最近记录: |