Mongoose Aggregate with $ disconnect to $ group

I find it difficult to solve this mongodb (mongoose) problem.

There is a Guess schema ( _id , title , tags ) with tags - this is an array of id_ tags (refers to the Tag schema).

 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); 

document example:

 { "_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") ] } ...... ..... 

I need to get a list of the most popular tags (tags). Above, I will show you the diagram and my mongoose solution request.

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

if I comment on this option

  { "$group": { "tags": '$tags.tags', "count": {"$sum": 1} } }, {"$sort": {"count": -1}}, {"$limit": 5} 

Then my query result

 [ { _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 } ] 

I will uncomment this request error. I want a Tag group and display the 5 most popular tags. How to fix it?

The result I want looks like

 [ { tags: 578857529507cafd5fe1f9b6, count: 10 }, { tags: 578857529507cafd5fe1f9b7, count: 9 }, { tags: 578854779507cafd5fe1f9a6, count: 8 }, { tags: 578854779507cafd5fe1f9a5, count: 5 }, { tags: 5788570d9507cafd5fe1f9b0, count: 2 } ] 
+6
source share
1 answer

At the $ group stage, you need to specify _id. He is sure to be a keyword group. So basically you need to change

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

to

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

Thus, a full pipeline will:

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

All Articles