2013-09-10 2 views
0

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

Это то, что я в настоящее время

$reduce = "function (obj, prev) { "; 
    $reduce .= "if(prev.count >= 2){"; 
    $reduce .= "prev.mailSubject = obj.mailSubject;"; 
    $reduce .= "}"; 
    $reduce .= "prev.count+=1;"; 
    $reduce .="}"; 
    $res = $this->db->forms->group(
       array('formid' => true), 
       array('mailSubject' => ''),''), 
       $reduce           
      ); 

Кажется, что ничего не сбавляя, я до сих пор получил те же результаты, я не помещаю if. Что я делаю неправильно?

+0

Я не уверен, действительно ли вы поняли понятие «группа» и/или цель функции уменьшения. Не могли бы вы объяснить, что именно вы пытаетесь сделать? – Philipp

+0

Я пытаюсь выполнить следующий запрос sql: select * from forms group by formid limit 2, 100 – ianaz

+0

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

ответ

2

Значение MongoDB, эквивалентное SQL LIMIT, обычно представляет собой методы курсора limit() и skip(). К сожалению, драйверы MongoCollection::group PHP возвращают набор результатов, а не курсор. Но то, что вы можете сделать вместо этого использовать MongoCollection::aggregate и использовать агрегацию трубопровод из трех операторов:

  1. $group by your grouping criteria
  2. $limit to only take the first 100
  3. $skip to ignore the first two

Эти примеры используют синтаксис JSON для структур данных, но преобразовать их в синтаксис ассоциативного массива PHP не составит труда.

Адрес: Вы не отсортировали результаты. Пропуск обычно имеет смысл только тогда, когда ваши результаты сортируются по некоторым критериям, потому что в противном случае вы не знаете, какие документы будут пропущены. Заказ, в котором документы возвращены MongoDB, не указан. Это может выглядеть как порядок вставки в вашей среде разработки, но это не гарантируется и надежно прекратится после некоторых изъятий, обновлений и вставок. Если вы хотите отсортировать результаты, добавьте $sort в конвейер агрегации между точками 1 и 2.

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