Mongoose在$ group之前展开$ $

我有很多难以解决这个mongodb(mongoose)的问题。

有模式Guess_idtitletags )与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") ] } ...... ..... 

我需要获得最受欢迎的标签(标签)列表。 上面我向您展示架构和我的解决schememongoose查询。

  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 } ] 

在你的$小组阶段,你需要指定一个_id。 这是强制性的,将是关键的组。 所以基本上你需要改变

 { "$group": { "tags": '$tags.tags', "count": {"$sum": 1} } } 

 { "$group": { "_id": '$tags', "count": {"$sum": 1} } } 

所以完整的pipe道将是:

 Guess.aggregate([ { "$project": { "_id": 1, "tags": 1 } }, { "$unwind": "$tags" } , { "$group": { "_id": '$tags', "count": {"$sum": 1} } }, {"$sort": {"count": -1}}, {"$limit": 5} ]);