2014-10-08 4 views
0

Я работаю над сайтом, на котором наши системные администраторы могут выбрать, выбирать ли для извлечения наши данные из mongodb или elasticsearch. Я могу настроить оба варианта, но я хочу настроить случай переключения, который выберет правильную систему поиска документов на основе предпочтения в разделе администратора сайтов. Когда Монго возвращает объект StdClass я могу перебирать объекта для печати каждого элемента, используя что-то вроде следующего:PHP - Iterable Object Issue

foreach($items as $item) 
{ 
    print_r($item); 
} 

Затем я могу затем получить общее количество возвращенных предметов с помощью $ изделия-> COUNT(). Однако при использовании elasticsearch я возвращал объект, в котором мне нужно идти:

foreach($items['hits']['hits'] as $item) 
{ 
    print_r($item); 
} 

Количества можно получить с помощью $ всевозможных [ «хитов»] [ «всего»]. Если я извлечу массив элементов (назовем его «$ finalitems» и счетчик (назовем его $ count) из возвращаемых данных elasticsearch, как я могу преобразовать это в объект stdClass, как то, что возвращает mongo, чтобы я мог напрямую выполнять итерацию через класс, чтобы получить значение каждого элемента, а также вызвать метод count(), который будет получать счетчик? Я хочу сделать это, чтобы я мог легко переключаться между двумя объектами данных без необходимости иметь полностью отдельные функции обработки одна и та же задача

+0

Что такое вывод 'print_r ($ items);' во втором случае? Если вы получаете объект, возвращаемый, то запись массива вроде этого не будет работать. –

ответ

0

Я не рекомендую преобразовывать результат ElasticSearch в результат MongoDB по нескольким причинам. Один из них заключается в том, что, хотя теперь будет ощущение, что это облегчает работу, если у вас есть оба объекта как один и тот же объект , в будущем, поскольку, возможно, потребуется использовать/манипулировать другими полями, это может стать кошмаром.

Одним из решений является то, что вы создаете новый класс, скажем DocumentItem, и конвертируете как MongoDB И ElasticSearch результаты в этом классе. Таким образом, часть вашего кода, который манипулирует, выполняет итерации, выполняет другие операции с возвращаемым значением как MongoDB, так и ElasticSearch будет работать на объекте DocumentItem, используя его определенные методы.

И у вас будет две функции преобразования для перевода MongoDB & ElasticSearch возвращает значения этому объекту. В будущем, если необходимо добавить новое поле, вам необходимо будет соответствующим образом обновить функции преобразования. И если новый сервер документов добавлен, вам нужно только написать функцию преобразования, так как класс DocumentItem уже хорошо определен.

+0

Спасибо за объяснение. Я думаю, что вы здесь хорошо сделаете, и я попытаюсь пройти этот маршрут. – user2694306

+0

@ user2694306 - рад помочь, если у вас возникнут проблемы при создании ваших функций преобразования, я уверен, что в SO очень много людей! Сначала вы должны определить, как должен выглядеть класс DocumentItem, какие функции/переменные ему нужны, а затем начать писать функции преобразования для достижения этой цели. Удачи! – raidenace

Смежные вопросы