Doctrine+MongoDB — Как запрашивать документы с непустым массивом

Я хотел бы получить все документы с массивом лайков размером больше нуля. Я видел пример использования метода ->size() для получения массива определенного размера:

$qb = $dm->createQueryBuilder('Article')->field('comments')->size(0);

но не получить массив с размером, отличным от нуля, есть ли возможность сделать это?

Благодарю вас!


person Geva Tal    schedule 09.10.2012    source источник


Ответы (2)


Вы можете передавать определенные положительные целые числа в size, но вы не можете использовать его для запроса диапазонов. Это ограничение не Doctrine, а MongoDB. Документы на $size говорят:

$size не принимает диапазоны значений. Чтобы выбирать документы на основе полей с разным количеством элементов, создайте поле счетчика, значение которого увеличивается при добавлении элементов в поле.

Для этого добавьте поле $comments_count @Int в статью и обновите его либо а) в методах документа, которые изменяют $comments, либо б) в методе документа, аннотированном @PreUpdate.

Другой (неэффективный) вариант — использовать where с выражением javascript:

$where = "function() { return this.comments && this.comments.length > 0; }";
$qb = $dm->createQueryBuilder('Article')->field('comments')->where($where);
person dylan oliver    schedule 16.12.2013

Использование JavaScript для этого очень медленно. Вы должны предпочесть «чистый» QueryBuilder:

$qb = $dm->createQueryBuilder('Article');
$qb = $qb->field('comments')
         ->exists(true)
         ->not($qb->expr()->size(0));
person Byscripts    schedule 26.08.2015