node.js – 在$group之前使用$unwind的Mongoose Aggregate

前端之家收集整理的这篇文章主要介绍了node.js – 在$group之前使用$unwind的Mongoose Aggregate前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有很多难以解决这个 @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}
]);
原文链接:/nodejs/241245.html

猜你在找的Node.js相关文章