2013-04-29 4 views
2

Я пытаюсь подсчитать количество документов, связанных с идентификатором, а затем сортировать результаты. Вот пример документа (в коллекции media).Группа затем Сортировка с MongoDB

{ 
    "_id" : "00wlz2j2cu9kx", 
    "uploadedBy" : { 
    "uid" : "00wen1b4tfwn6", 
    } 
} 

В принципе, мне нужно сгруппировать все эти документы по uploadedBy.uid, сортировать по результирующему массиву с помощью подсчета документов. У меня есть эта команда до сих пор:

db.media.group({ 
    key: { 
    'uploadedBy.uid' : true 
    }, 

    reduce: function(obj, prev) { 
    prev.total += 1 
    }, 

    initial: { 
    total: 0 
    } 
}) 

Это дает мне этот массив.

[ 
    { 
    "uploadedBy.uid" : "00wen1b4tfwn6", 
    "total" : 1 
    }, 
    { 
    "uploadedBy.uid" : "00wp0s9c73dvl", 
    "total" : 2 
    } 
] 

Теперь мне просто нужно сортировать каждый из этих документов по total области. Как мне это сделать?

+0

Я полагаю, что будет зависеть от водителя, который вы используете. –

+0

Я использую драйвер Node.js. –

+0

Тогда, боюсь, я не могу вам помочь, я работаю с Java одним :) –

ответ

2

В случае, если Node.js рамка агрегации поддержки пытается использовать его

db.media.aggregate([ 
    {$group: {_id: '$uploadedBy.uid', 'count': {$sum: 1}}}, 
    {'$sort': {'count': -1}} 
]) 

Я не уверен, что этот код не имеет никаких проблем, но вы можете попробовать что-то вроде этого.

EDIT Изменен. Этот ответ сработал для меня. Вы можете также добавить к пропуску/предел здесь, чтобы получить 5 лучших результатов, как показано на рисунке ниже:

db.media.aggregate([ 
    {$group: {_id: '$uploadedBy.uid', 'count': {$sum: 1}}}, 
    {'$sort': {'count': -1}}, 
    {'$skip': 0}, 
    {'$limit': 5} 
]) 
+1

, что запрос агрегирования неверен, вы используете uid и считаете как _id, который не будет работать. –

+0

К сожалению, вы правы – dyrkin

+0

спасибо @dyrkin ответ работал для меня. – Rohit

3

Я бы рекомендовал использовать в Aggregation Framework для этого, если ваша MongoDB версия> = 2,1. Множество простых запросов агрегирования легче писать с ним, в отличие от MapReduce (функция group(), которую вы используете, в настоящее время использует MapReduce под обложками).

Структура агрегирования обеспечивает легкий вариант $ сортировки заказать результаты, следующим образом:

var MongoClient = require("mongodb").MongoClient; 

MongoClient.connect("mongodb://localhost/myDb", function (err, db) { 
    "use strict"; 
    var collection = db.collection("media"), 
     resultsHandler = function (err, results) { 
      if (err) { 
       console.log(err); 
      } 
      console.log(results); 
     }; 

    collection.aggregate(
     { 
      $group: { 
       _id: { uid: "$uploadedBy.uid" }, 
       total: { $sum: 1 } 
      } 
     }, 
     { 
      $sort: { 
       total: -1 
      } 
     }, 
     resultsHandler 
    ); 
}); 
+1

Возможно, вы должны сделать $ group _id просто «$ uploadedBy.uid» - нет никаких оснований для того, чтобы он был встроенным документом. –

+0

Хорошая точка, просто привычка использовать многоколоночные ключи :) –