2015-08-31 1 views
-1

У меня есть следующий набор Чидаде на моей базе данных MongoDB:Как я могу агрегировать документы в массиве, а не в коллекции в MongoDB?

{ 
    "_id" : 0, 
    "nome" : "CIDADE0", 
    "qtdhab" : 1231043 
} 

Итак, вот что я хочу сделать. Я пытаюсь сделать эквивалент этого SQL запроса в MongoDB:

SELECT MAX(QTDHAB) FROM CIDADE WHERE QTDHAB <= (SELECT AVG(QTDHAB) FROM CIDADE); 

В принципе, я хочу наибольшего значения поля qtdhab из коллекции Cidade, который следует за состоянием быть ниже среднего значения того же поля qtdhab в той же коллекции cidade. Таким образом, я отобразил это в 3-х запросы, например:

var resultado = db.cidade.aggregate({"$group": {"_id": null, "avgHab": {"$avg": "$qtdhab"}}}).toArray() 
var resultado2 = db.cidade.find({qtdhab: {$lte: resultado[0].avgHab}}).toArray() 
resultado2.aggregate({"$group": {"_id": null, "maxHab": {"$max": "$qtdhab"}}}) 

Проблема заключается в том, как я узнал, трудный путь, что нет .aggregate метода для массива, таких как resultado2, поэтому последний запрос возвращает ошибку. Есть ли другой способ для меня получить наибольшее значение для поля qtdhab из этого массива документов, который был сгенерирован этими двумя запросами?

+0

Мы не можем видеть документ, но вы хотите, чтобы в основном что-то вроде получить первые результаты от каждого массива, а затем выработать некоторые значения От этого. Но сначала вам нужно деконструировать массив. Поэтому см. ['$ Unind'] (http://docs.mongodb.org/manual/reference/operator/aggregation/unwind/) или, по крайней мере, опубликовать то, с чем здесь люди могут работать. –

+0

Прошу прощения, я обновил сообщение с помощью структуры документа. – Don

+0

Какова структура этого документа для массивов? Я не вижу массива. Или это элемент массива внутри документа? Я думаю, что фактический документ, содержащий массив, является неотъемлемой частью здесь. –

ответ

1

Вы можете достичь этого, используя только один запрос (агрегации):

db.cidade.aggregate([ 
    /*find the avg and keep also the aggregated field*/ 
    {"$group": { 
     "_id": null, 
     "qtdhab" : {"$push" :"$qtdhab"}, 
     "avgHab": {"$avg": "$qtdhab"} 
    }}, 
    /*unwind the array*/ 
    {$unwind: "$qtdhab"}, 
    /*get the max from the fields less than the avg*/ 
    {"$group": { 
     "_id": null, 
     "res" : {"$max" : {$cond :[{$lte :["$qtdhab", "$avgHab"]}, "$qtdhab", null]} }, 
    }} 
]) 
+0

Большое спасибо за ответ! Я не знаком с $ cond, хотя, поэтому я прочитаю документацию, чтобы понять ваш код перед его тестированием. Я отправлю комментарий здесь, когда закончите. – Don

+0

Протестировано, и это отлично, спасибо. – Don

Смежные вопросы