2015-10-06 3 views
0

Я успешно выполнил один запрос, который дает мне среднее значение одного из определенного поля в моей схеме. Я хочу использовать значение среднего значения, которое я получил в предыдущем запросе, в следующем вопросе для сравнения. Когда я пытаюсь это сделать, командная строка рассматривает это как два разных запроса, а не один.Использование результата одного запроса в следующем запросе

Как это сделать в MongoDB?

+1

Можете ли вы показать нам свои текущие запросы? –

+1

Первый запрос: var reduceFunction = function (currentValue, previousValue) {previousValue.total + = currentValue.stars; \t previousValue.count + = 1; }; var finalizeFunction = function (currentValue) { currentValue.average = currentValue.total/currentValue.count; }; Результат = db.business.group ({ "_id": { "звезды": истинные}, начальное: {всего: 0, количество: 0}, уменьшить: reduceFunction, финализац: finalizeFunction }); – Blank

+0

Второй запрос: db.business.find ({stars: {$ gt: Result.average}}) – Blank

ответ

0

Я подозреваю, что вы действительно спрашиваете в контексте API, который вы используете, а не обрабатываете в оболочке, но принципы остаются неизменными.

Ваш первый результат всегда является «массивом», возвращаемым методом .group(), поэтому для доступа к этому как единственному значению необходимо вернуть только элемент «первого» массива, который является индексом 0.

Также ваша операция и весь случай просто ищут «среднее значение» поля, а затем ищут запросы для тех элементов, которые больше, чем возвращаемое среднее значение. Метод .aggregate() имеет гораздо более простой синтаксис для этого, а также работает намного быстрее, поскольку его операции кодируются естественным образом, а не интерпретируются JavaScript, что в последнем случае значительно замедлит работу.

использовать нативные операции, если нет никакой альтернативы:

var result = db.business.aggregate([ 
    { "$group": { 
     "_id": null, 
     "average": { "$avg": "$stars" } 
    }} 
]).toArray()[0]; 

db.business.find({ "stars": { "$gt": result.average } }) 

Первая операция уменьшает вплоть до массива одного объекта, из которого вы берете только, что первый элемент из массива. Затем объект можно просто ссылаться во втором запросе, возвращая результат.

В асинхронной среде вам просто нужно вызвать второй запрос в результате обратного вызова первой операции, чтобы увидеть результат с областью действия после завершения этой операции. Но используйте .aggregate(), так как он лучше подходит для задачи и быстрее.

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