Как мне выполнить запросы в стиле консоли 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,
)