Код доступа Mongodb, который будет выполняться на сервере во время запроса - PullRequest
0 голосов
/ 04 мая 2018

Я использую 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, см. Оригинальный пост.

...