Как мне выполнить запросы в стиле консоли MongoDB в PHP? - PullRequest
2 голосов
/ 28 ноября 2011

Я пытаюсь получить запрос MongoDB из консоли javascript в мое приложение PHP. Чего я пытаюсь избежать, так это необходимости переводить запрос в формат PHP "родного драйвера" ... Я не хочу создавать массивы и функции ручной цепочки больше, чем хочу вручную создавать массив внутренней структуры запросов MySQL только для получения данных.

У меня уже есть строка, производящая точное содержимое, которое я хочу, в консоли Mongo:

db.intake.find({"processed": {"$exists": "false"}}).sort({"insert_date": "1"}).limit(10);

Вопрос в том, есть ли способ передать эту строку, как есть, в MongoDB и вернуть ей курсор с набором данных, который я запрашиваю?

Сейчас я нахожусь в состоянии "написать свой собственный синтаксический анализатор, потому что недопустимо, чтобы json превращал подмножество допустимых запросов Mongo в формат, в котором хочет собственный драйвер PHP", что не очень весело.

Я не хочу ORM или массивную библиотеку-обертку; Я просто хочу дать функции мою строку запроса, как она существует в консоли, и вернуть итератор, с которым я могу работать. Я знаю, что есть пара PHP-приложений Mongo Manager, которые, по-видимому, принимают запросы в стиле консоли и обрабатывают их, но при первоначальном просмотре их кода я не уверен, как они обрабатывают перевод.

Мне очень нравится работать с mongo в консоли, но я быстро начинаю ненавидеть мысль о преобразовании каждого запроса в формат, который хочет родной писатель ...

Ответы [ 3 ]

14 голосов
/ 29 ноября 2011

Я не хочу создавать массивы и функции ручной цепочки ...

Ваш код оболочки заполнен "словарями ручной сборки" и "функции ручной цепочки" .Все эти точки являются связанными функциями, и все JSON представляют словари / хеш-таблицы.

Давайте сделаем быстрое сравнение.

Javascript:

db.intake
  .find({"processed": {"$exists": false}})
  .sort({"insert_date": "1"})
  .limit(10);

PHP:

db->intake
  ->find(array('processed'=> array('$exists'=> false)))
  ->sort(array('insert_date'=> '1'))
  ->limit(10);

Поэтому я в основном заменил

  • "точки" на "стрелки"
  • "двоеточие" на"двойная стрелка"
  • "левая скобка" с "массивом" ("
  • " правая скобка "с") "

Похоже, вы действительно злитесьна PHP.И я могу понять, что PHP может быть тупым языком.Однако когда дело доходит до PHP-драйвера MongoDB, синтаксис максимально приближен к «оригинальному» javascript.

2 голосов
/ 29 ноября 2011

Вы можете использовать json_decode() для эффективного выполнения запроса (использование MongoDB::execute не так эффективно) и вернуть курсор назад. Например.,

$db->intake->find(json_decode('{"processed": {"$exists": "false"}}'))
    ->sort(json_decode('{"insert_date": "1"}'))->limit(10);

Не уверен, что это лучше для вас, чем использование ассоциативных массивов, но это вариант. Таким образом, вам нужно только посмотреть на синтаксис запроса "JSON".

(Кроме того, я думаю, что вы имеете в виду $exists:false, а не $exists:"false".)

0 голосов
/ 28 ноября 2011

MongoDB :: execute должен позволять вам запускать любой код JavaScript, но, к сожалению, будет возвращать строки, поэтому вам нужно будет фактически выполнить итерацию набора данных, используя только JavaScript.

>> $d = new Mongo
Mongo::__set_state(array(
   'connected' => true,
   'status' => NULL,
   'server' => '',
   'persistent' => NULL,
))
>> $db = $d->database;
MongoDB::__set_state(array(
   'w' => 1,
   'wtimeout' => 10000,
))
>> $db->execute('db.intake.find({"processed": {"$exists": "false"}}).sort({"insert_date": "1"}).limit(10);');
array (
  'retval' =>
  array (
    'value' => 'DBQuery: database.intake -> undefined',
  ),
  'ok' => 1,
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...