Я подозреваю, что вы действительно спрашиваете в контексте 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()
, так как он лучше подходит для задачи и быстрее.
Можете ли вы показать нам свои текущие запросы? –
Первый запрос: 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
Второй запрос: db.business.find ({stars: {$ gt: Result.average}}) – Blank