我很难解决这个mongodb(mongoose)问题。
架构Guess
(_id
,title
,tags
)tags
是tags_id数组(从Tag
架构引用)。
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var schema = mongoose.Schema({
title: {
type: Schema.Types.Mixed,
required: true
},
tags: [{
type: Schema.Types.ObjectId,
ref: 'Tag',
required: false,
default: []
}]
});
schema.index({ '$**': 'text' });
module.exports = mongoose.model('Guess', schema);
文档示例:
{
"_id" : ObjectId("578857529507cafd5fe1f9b3"),
"title" : {
"en" : "Will Amazon start its first drone deliveries this year?"
},
"tags" : [
ObjectId("578857529507cafd5fe1f9b7"),
ObjectId("578857529507cafd5fe1f9b6")
]
}
{
"_id" : ObjectId("578857a59507cafd5fe1f9bb"),
"title" : {
"en" : "Will Singapore 3D print homes during 2016?"
},
"tags" : [
ObjectId("578857a59507cafd5fe1f9bf"),
ObjectId("578857529507cafd5fe1f9b6")
]
}
......
.....
我需要获取最受欢迎的标签(标签)列表。上面我向您展示了架构和我的解决方案mongoose查询。
Guess.aggregate([
{
"$project": {
"_id": 1,
"tags": 1
}
},
{
"$unwind": "$tags"
}
// ,
// {
// "$group": {
// "tags": '$tags.tags',
// "count": {"$sum": 1}
// }
// },
// {"$sort": {"count": -1}},
// {"$limit": 5}
], function (error, result) {
//
});
如果我评论此选项
{
"$group": {
"tags": '$tags.tags',
"count": {"$sum": 1}
}
},
{"$sort": {"count": -1}},
{"$limit": 5}
然后我的查询结果是
[ { _id: 578857529507cafd5fe1f9b3,
tags: 578857529507cafd5fe1f9b7 },
{ _id: 578857529507cafd5fe1f9b3,
tags: 578857529507cafd5fe1f9b6 },
{ _id: 578857a59507cafd5fe1f9bb,
tags: 578857a59507cafd5fe1f9bf },
{ _id: 578857a59507cafd5fe1f9bb,
tags: 578857a59507cafd5fe1f9be },
{ _id: 578857d637cc983f60774fcb,
tags: 578857d637cc983f60774fcf },
{ _id: 578857d637cc983f60774fcb,
tags: 578857d637cc983f60774fce },
{ _id: 578f2cbe875ec80f11e49a66,
tags: 578f2cbe875ec80f11e49a6a },
{ _id: 578f2e25b470bb62115f1741,
tags: 578f2e25b470bb62115f1745 },
{ _id: 578f2f119cd9848c1180be8b,
tags: 578f2f119cd9848c1180be8f },
{ _id: 578f2f119cd9848c1180be8b,
tags: 578f2f119cd9848c1180be8e },
{ _id: 578f50876a3ba88d13aed982,
tags: 578f50876a3ba88d13aed986 },
{ _id: 578f50876a3ba88d13aed982,
tags: 578f50876a3ba88d13aed985 },
{ _id: 578f510c6a3ba88d13aed989,
tags: 578f510c6a3ba88d13aed98c },
{ _id: 578f510c6a3ba88d13aed989,
tags: 578f510c6a3ba88d13aed98d } ]
我取消注释这个查询错误。我想要小组tag
并显示5个最受欢迎的标签。如何解决?
我想要的结果看起来像是
[ { tags: 578857529507cafd5fe1f9b6, count: 10 },
{ tags: 578857529507cafd5fe1f9b7, count: 9 },
{ tags: 578854779507cafd5fe1f9a6, count: 8 },
{ tags: 578854779507cafd5fe1f9a5, count: 5 },
{ tags: 5788570d9507cafd5fe1f9b0, count: 2 } ]
答案 0 :(得分:7)
在$group
阶段,您需要指定_id
。它是强制性的,将成为按键分组。所以基本上你需要改变:
{
"$group": {
"tags": '$tags.tags',
"count": {"$sum": 1}
}
}
为:
{
"$group": {
"_id": '$tags',
"count": {"$sum": 1}
}
}
所以完整的管道将是:
Guess.aggregate([
{
"$project": {
"_id": 1,
"tags": 1
}
},
{
"$unwind": "$tags"
}
,
{
"$group": {
"_id": '$tags',
"count": {"$sum": 1}
}
},
{"$sort": {"count": -1}},
{"$limit": 5}
]);