0

由于视频有 embeds_many 个日期,而日期有 embeds_many 个国家/地区。使用聚合框架,我将如何获得所有的总数likes_count

我得到以下结构:

{ "_id" : ObjectId( "5190fbbc72357e713900001b" ),
  "dates" : [ 
    { "_id" : ObjectId( "5190fbbc72357e713900001c" ),
      "countries" : [ 
        { "_id" : ObjectId( "5190fbbc72357e713900001d" ),
          "unique_views_count" : 500,
          "non_unique_views_count" : 1000,
          "likes_count" : 1,
          "comments_count" : 1,
          "iso_two_letter_country_code" : "US",
          "country_name" : "United States" }, 
        { "_id" : ObjectId( "5190fbbc72357e713900001e" ),
          "unique_views_count" : 300,
          "non_unique_views_count" : 777,
          "likes_count" : 0,
          "comments_count" : 0,
          "iso_two_letter_country_code" : "UK",
          "country_name" : "United Kingdom" } ],
      "date" : 20130513 } ],
  "video_id" : 1 }

到目前为止,我已经尝试过,但无济于事:

Video.collection.aggregate(
  { '$unwind' => '$dates.countries'},
  {
    '$group' => {
      '_id' => '$_id'
      'likes' => { '$sum' => '$dates.countries.likes_count' }
    }
  }
)
4

1 回答 1

1

这是一种获取文档(来自 MongoDB shell)likes_count上分组时间总数的方法:_id

db.Videos.aggregate(
    {'$unwind': '$dates'}, 
    {'$unwind': '$dates.countries'}, 
    {$project: 
        { _id: 1, 
         likes_count: '$dates.countries.likes_count'}}, 
    {$group: 
        { _id : '$_id', 
          total_likes: { $sum: '$likes_count'}}})

关键是分多个步骤进行:

  1. 首先展开日期数组
  2. 然后,展开每个国家/地区的国家/地区数组
  3. 接下来,将 映射likes_count到新属性以便于访问
  4. 最后,将所有的和存储在_id和上的总和上likestotal_likes

这给出了以下结果:

{
    "result" : [{
        "_id" : ObjectId("5190fbbc72357e713900001b"),
        "total_likes" : 1
    }],
    "ok" : 1
}

如果您想在date现场进行分组,则需要将其包含在投影中,然后稍后在管道中对其进行分组:

db.so.aggregate(
    {'$unwind': '$dates'},
    {'$unwind': '$dates.countries'}, 
    {$project: 
        { _id: 1, 
          date: '$dates.date', 
          likes_count: '$dates.countries.likes_count'}},
    {$group: 
        { _id : '$date', 
          total_likes: { $sum: '$likes_count'}}})

它的基本步骤与上面相同,只是这次将date包含在投影中,然后用作group _id.

如果您想在特定日期匹配,您可以添加:

{ $match : { 'date' : 20130512 } } 

到上例中投影后的管道。

于 2013-05-13T16:42:30.397 回答