2012-05-23 2 views
1

Я пытаюсь сэкономить некоторое действие db, скомпилировав зацикленный бит кода с одним запросом. До того, как я просто добавлял к аналогичным операторам, используя цикл, прежде чем запускать запрос, но я не могу получить та же идея идет в Mongo, id оценивает любые идеи .... Я в основном пытаюсь сделать что-то вроде этого, но со значением как массивMongodb like statement с массивом

('приложение', заменяет 'mongodb' до моей установки CI)

Вот как я делал это заранее mongofication:

foreach ($workids as $workid): 
     $this->ci->app->or_like('work',$workid) ; 
    endforeach; 
    $query = $this->ci->db->get("who_users"); 
    $results = $query->result(); 
    print_r($results); 

и это, как я надеялся, что я мог заставить его работать, но никакая радость здесь, эта функция не только предназначена для приема строки

$query = $this->ci->app->like('work',$workids,'.',TRUE,TRUE)->get("who_users"); 
    print_r($query); 

Если кто-то могут придумать способ любых хитрые методы, которые я могу получить возвращенный массив с одним вызовом снова было бы здорово, я не нашел никакой документации по этому типу запроса. Единственный способ, о котором я могу думать, - это перебрать запрос и вставить его в новый массив результатов ... но это действительно будет больно, если мое приложение увеличится.

+0

Интересно, возможно ли, что я могу сделать where_in с подстановочными знаками как-то – IndelibleHeff

+0

Какой запрос вы пытаетесь запустить против MongoDB? Я не совсем понимаю это из вашего вопроса выше. – Derick

+0

хорошо им проверка, если идентификатор в поле перечисленных идентификаторов так в основном что-то вроде - получить строки, где идентификаторы содержат $ ID, я делаю это сейчас с Еогеаспа ($ workids как $ workid): \t \t \t $ html. = "\ r \ n friendsbox [". $ workid.знак равно \t \t \t $ this-> ci-> app-> like ('workids', $ workid, 'im', TRUE, TRUE); \t \t endforeach; \t \t \t \t $ query = $ this-> ci-> app-> get ("who_users"); Но это возвращает только последний запрос, мне нужен способ сделать это по массиву. , или, что более важно, способ их сцепить. – IndelibleHeff

ответ

1

Вы используете codeigniter-mongodb-library? Основываясь на существующей документации or_like(), похоже, что CI обертывает каждое совпадение с % подстановочными знаками. Эквивалентный запрос в Монго будет серия регулярных выражений спичек в $or статье:

db.who_users.find({ 
    $or: [ 
    { work: /.*workIdA.*/ }, 
    { work: /.*workIdB.*/ }, 
    ... 
]}); 

К сожалению, это будет весьма неэффективно, если (1) work поле не индексируется и (2) ваши регулярные выражения привязываются с некоторым постоянным значением (например, /^workId.*/). Это описано более подробно в regex documentation Монго.

Основываясь на ваших комментариях к OP, похоже, что вы храните несколько идентификаторов в поле work в виде строки с разделителями-запятыми. Чтобы использовать схему Mongo, вы должны моделировать это как массив строк. После этого, когда вы запрашиваете поле work, Mongo рассмотрит все значения в массиве (документально обсужденный here).

db.who_users.find({ 
    work: "workIdA" 
}); 

Этот запрос будет соответствовать запись которого work значение было ["workIdA", "workIdB"]. И если нам нужно искать один из множества идентификаторов (принимая это обратно в ваш или запрос), мы можем распространить этот пример с оператором $in:

db.who_users.find({ 
    work: { $in: ["workIdA", "workIdB", ...] } 
}); 

Если это отвечает вашим потребностям, обязательно индекс поле work.

+0

да, вы правы, я недавно перешел в код воспламенить библиотеку MongoDB, и это будет лучше структурировано в новой среде. Похоже, мне нужно будет создать функцию в библиотеке, чтобы попытаться справиться с предложениями mulitple. – IndelibleHeff

+0

Вы уверены, что нужен новый метод? Я не работал с библиотекой, но 'where_in()' выглядит так, как вам нужно. – jmikola

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