我有很多难以解决这个
@L_404_0@(猫鼬)的问题.
有标签的模式Guess(_id,title,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 },tags: 578857a59507cafd5fe1f9be },{ _id: 578857d637cc983f60774fcb,tags: 578857d637cc983f60774fcf },tags: 578857d637cc983f60774fce },{ _id: 578f2cbe875ec80f11e49a66,tags: 578f2cbe875ec80f11e49a6a },{ _id: 578f2e25b470bb62115f1741,tags: 578f2e25b470bb62115f1745 },{ _id: 578f2f119cd9848c1180be8b,tags: 578f2f119cd9848c1180be8f },tags: 578f2f119cd9848c1180be8e },{ _id: 578f50876a3ba88d13aed982,tags: 578f50876a3ba88d13aed986 },tags: 578f50876a3ba88d13aed985 },{ _id: 578f510c6a3ba88d13aed989,tags: 578f510c6a3ba88d13aed98c },tags: 578f510c6a3ba88d13aed98d } ]
我取消注释这个查询错误.我想要组标签并显示5个最受欢迎的标签.怎么解决?
我想要的结果看起来像
[ { tags: 578857529507cafd5fe1f9b6,count: 10 },{ tags: 578857529507cafd5fe1f9b7,count: 9 },{ tags: 578854779507cafd5fe1f9a6,count: 8 },{ tags: 578854779507cafd5fe1f9a5,count: 5 },{ tags: 5788570d9507cafd5fe1f9b0,count: 2 } ]
解决方法
在$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} } },{"$limit": 5} ]);