Я использую mongodb , и я пытаюсь сделать запрос о коллекции и получить хорошо отфильтрованный и упорядоченный и прогнозируемый результат. К сожалению, логика, которую я хочу реализовать, сложна, и даже если мы предположим, что можно использовать db.collection.aggregate , это приведет к длинному, сложному, трудно читаемому дескриптору агрегата, в который я верю большинству случаи нежелательны.
Итак, я подумал - Mongodb понимает javascript, поэтому, скорее всего, я могу передать функцию javascript во время самого запроса, ожидая, что мой сервер mongo выполнит запрос, запустит предоставленную функцию, передающую ему результат запроса, а затем вернет Конечный результат для меня. Что-то вроде:
db.collection.find(myQuery, serverCallback).toArray(function(err, db) { ... });
К сожалению, кажется, что это невозможно. В ходе дальнейших исследований я достиг хранимого javascript и понял, что могу определить этот serverCallback на сервере вместо его передачи. Что хорошо, но мне кажется грязным и неправильным. Так что в основном это причина, почему я решил спросить здесь, может ли кто-то с лучшим опытом mongodb аргументировать этот подход.
[Мое понимание]
Я считаю, что не каждый случай фильтрации, агрегирования и т. Д. Может быть достигнут с помощью db.collection.aggregate, что вполне нормально. Для всех случаев, когда требуется особый способ фильтрации результата запроса, у нас есть два варианта - определить сохраненный javascript, который мы выполняем в результате запроса на сервере mongo, или получить информацию с сервера и выполнить обработку / фильтрацию / и т.п. в клиенте.
- Если мы решим определить хранимый javascript, весьма вероятно, что мы определим некоторую специфичную для проекта логику на сервере Монго. Я думаю, что специфика проекта всегда должна принадлежать коду проекта, а не базе данных. Таким образом, мы можем создавать версии с помощью git и легко получать к ним доступ, если мы хотим изменить их.
- Если мы решим применить логику агрегирования после запроса, мы теряем возможность выбирать, кто будет выполнять вычисления - сервер или клиент. Который может быть мнением, которое мы хотим иметь.
[Мой вопрос]
В чем причина запрета предоставления serverCallback во время запроса? Я считаю, что должны быть причины, которые я здесь не понимаю.
[редактирует]
Сначала я хочу сказать, что я решил свою проблему, и поскольку она была слишком сложной, чтобы ее легко объяснить. Я предпочту придерживаться чего-то более простого, чтобы объяснить и понять. Я считаю, что этот пример хранимого в MongoDB javascript является отличным примером, поэтому давайте его использовать. По сути, я попытался спросить, есть ли способ передать эту функцию суммы во время db.collection.find (и почему ее нет). Примерно так:
function sum(queryResultAsArray) {
//Do whatever we want with queryResultAsArray
//For the example we filter result rows with x + y == 6;
return queryResultAsArray.filter(function(row) {
return row.x + row.y == 6
});
}
db.test.find({}, queryResultAsArray);
И это должно быть равным примерам:
db.test.find({$where: "sum(this.x, this.y) == 6"});
Чтобы понять, почему можно предпочесть передачу функции, а не хранимый javascript, см. Оригинальный пост.