如何在Mongo中汇总常见值?

时间:2015-06-05 06:35:33

标签: mongodb mongoose

我有以下文件:

{ asset : {
    assetName : abc,
    attributes : {
      Artist : XYZ,
      Duration : 10
     }
  }
}
{ asset : {
    assetName : pqr,
    attributes : {
      Artist : EFG,
      Duration : 5
     }
  }
}
{ asset : {
    assetName : HIJ,
    attributes : {
      Artist : XYZ,
      Duration : 10
     }
  }
}

我想按如下方式收集检索数据结果:

{ result : {
   Artist: {
       values : [XYZ, EFG],
       freq : [2, 1]
   }
   Duration : {
       values : [10, 5],
       freq : [2, 1]
  }
}

应根据频率对结果进行排序。

将使用mongoose包节点进行查询。

1 个答案:

答案 0 :(得分:1)

您可以使用aggregation

db.collectionName.aggregate(
    [
        { "$group": { 
                      "_id":null,
                      "Artist": { "$push":"$asset.attributes.Artist" },
                      "Duration": { "$push":"$asset.attributes.Duration" } 
                    }
        },
        { "$project": { "_id":0,"Artist":1,"Duration": 1 }}
    ]
)

修改

根据新编辑的问题,您可以进行聚合以获得结果

db.collectionName.aggregate({
  "$group": {
    "_id": null,
    "data": {
      "$push": {
        "artist": "$asset.attributes.Artist",
        "duration": "$asset.attributes.Duration"
      }
    }
  }
}, {
  "$unwind": "$data"
}, {
  "$group": {
    "_id": {
      "a": "$data.artist",
      "b": "$data.duration"
    },
    "count": {
      "$sum": 1
    }
  }
}, {
  "$group": {
    "_id": null,
    "ArtistValues": {
      "$push": "$_id.a"
    },
    "ArtistFreq": {
      "$push": "$count"
    },
    "DurationValue": {
      "$push": "$_id.b"
    },
    "durationfreq": {
      "$push": "$count"
    }
  }
}, {
  "$project": {
    "Artist": {
      "values": "$ArtistValues",
      "freq": "$ArtistFreq"
    },
    "Duration": {
      "values": "$DurationValue",
      "freq": "$durationfreq"
    },
    "_id": 0
  }
}).pretty()