سؤال

أنا بحاجة إلى مجموعة من _ البلدان والبلدان.لقد تمكنت من مجموعة من قبل _id, ، ولكن أود أن أعرف كيفية تجميع البلدان في هذه _idالصورة والعودة العد لكل بلد.

أنا أستخدم إطار التجميع.حتى الآن جيد جدا.

conn = Mongo::Connection.new
db   = conn['foobar_development']

cmd = {
  aggregate: 'live_daily_stats',
  pipeline: [
    { '$project' => {
      :metacontent => 1,
      :visits => 1,
    } },
    { '$unwind' => '$visits' },
    { '$match' => { 'visits.minute' => { '$gt' => 224 } } },
    { '$sort' => { 'visits.minute' => 1 } },
    { '$group' => { 
      :_id => '$_id', 
      :visits => { '$push' => '$visits' }, 
      :visits_count => { '$sum' => 1 },
      :metacontent => { '$addToSet' => '$metacontent' },
      } 
    },
    { '$sort' => { 'visits_count' => -1 } },
  ]
}

res = db.command(cmd)['result']

العوائد التالية:

[
    [0] {
                 "_id" => "20120726/foobar/song/custom-cred",
              "visits" => [
            [0] {
                                              "country_name" => "UK",
                               "iso_two_letter_country_code" => "UK",
                                                   "referer" => "http://localhost:3000/",
                                                    "minute" => 59,
                                                  "token_id" => "134326199711wfryhpdq"
            },
            [1] {
                                              "country_name" => "UK",
                               "iso_two_letter_country_code" => "UK",
                                                   "referer" => "http://localhost:3000/",
                                                    "minute" => 59,
                                                  "token_id" => "134326199711wfryhpdq"
            },
            [2] {
                                              "country_name" => "US",
                               "iso_two_letter_country_code" => "US",
                                                   "referer" => "http://localhost:3000/",
                                                    "minute" => 59,
                                                  "token_id" => "134326199711wfryhpdq"
            }
        ],
        "visits_count" => 1,
         "metacontent" => [
            [0] {
                                     "date" => "20120726"
            }
        ]
    },
    [1] {
                 "_id" => "20120725/foobar/song/test-pg3-long-title-here-test-lorem-ipsum-dolor-lo",
              "visits" => [
            [0] {
                                              "country_name" => "UK",
                               "iso_two_letter_country_code" => "UK",
                                                   "referer" => "http://localhost:3000/",
                                                    "minute" => 58,
                                                  "token_id" => "13432600883knjzcbic"
            }
        ],
        "visits_count" => 1,
         "metacontent" => [
            [0] {
                                     "date" => "20120725"
            }
        ]
    }
]
هل كانت مفيدة؟

المحلول

لقد غيرت $group لتسلسل على حد سواء _id و country_name:

cmd = {
  aggregate: 'live_daily_stats',
  pipeline: [
    { '$project' => {
      :metacontent => 1,
      :visits => 1,
    } },
    { '$unwind' => '$visits' },
    { '$match' => { 'visits.minute' => { '$gt' => 224 } } },
    { '$sort' => { 'visits.minute' => 1 } },
    { '$group' => { 
      :_id => { '$add' => ['$_id', '$visits.country_name']}, 
      :visits => { '$push' => '$visits' }, 
      :visits_count => { '$sum' => 1 },
      :metacontent => { '$addToSet' => '$metacontent' },
      } 
    },
    { '$sort' => { 'visits_count' => -1 } },
  ]
}

نصائح أخرى

من وثائق

$group تجميع المستندات معا لغرض الحساب القيم المجمعة استنادا إلى مجموعة من المستندات.عمليا غالبا ما تدعم المجموعة مهام مثل متوسط مشاهدات الصفحة لكل صفحة في موقع على شبكة الإنترنت على أساس يومي.

يعتمد إخراج $group على كيفية تعريف المجموعات.ابدأ ب تحديد معرف (أيحقل _id) للمجموعة التي تنتمي إليها إنشاء مع خط الأنابيب هذا.يمكنك تحديد حقل واحد من المستندات قيد الإعداد، أو قيمة محسوبة مسبقا، أو مفتاح تجميع مكون من عدة حقول واردة.

يجب أن يحدد كل تعبير مجموعة حقل _id.يمكنك تحديد _id الحقل كمرجع مسار حقل منقط ، مستند يحتوي على حقول متعددة محاطة بأقواس (أي.{ و }), أو قيمة ثابتة.

سأحاول التجميع حسب _id والبلد أولاً (أسمح لك بإجراء العد الذي تريده)، ثم قم بتجميع النتيجة حسب _id فقط لإعطاء البنية التي تريدها.

محدث:

كنت أفكر بشيء كهذا..لكن ليس لدي إعداد env للتحقق من ذلك ..

    conn = Mongo::Connection.new
    db   = conn['foobar_development']

    cmd = {
      aggregate: 'live_daily_stats',
      pipeline: [
        { '$project' => {
          :metacontent => 1,
          :visits => 1,
        } },
        { '$unwind' => '$visits' },
        { '$match' => { 'visits.minute' => { '$gt' => 224 } } },
        { '$sort' => { 'visits.minute' => 1 } },
        { '$group' => { 
          :_id => {'$_id','$visits.iso_two_letter_country_code'},
          :page_id => '$_id',
          :visits_count => { '$sum' => 1 },
   .... whatever you want ...
          :metacontent => { '$addToSet' => '$metacontent' },
          } 
        },
        { '$group' => { 
          :_id => '$page_id', 
   .... whatever you want ...
          } 
        },
        { '$sort' => { 'visits_count' => -1 } },
      ]
    }

    res = db.command(cmd)['result']
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top