Как мне выполнить запросы в стиле консоли MongoDB в PHP?

Я пытаюсь получить запрос 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, которые, очевидно, принимают запросы консольного стиля и обрабатывают их, но при первоначальном просмотре их кода я не уверен, как они обрабатывают перевод.

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

3 ответа

Решение

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

Код вашей оболочки заполнен "словарями ручной сборки" и "функциями ручной цепочки". Все эти точки являются связанными функциями, и все 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.

Вы могли бы использовать 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".)

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,
)
Другие вопросы по тегам