2015-05-15 2 views
2

У меня есть прецедент, в котором мой запрос нужно найти на основе 3 необязательных полей, а один из них - в виде коллекции.

«3 дополнительных полей» часть уже решена этот пост Spring Data MongoDB AND/OR query with multiple optional parameters

Однако я Runnig в вопросе с $in для сбора поданной.

Например, в следующем запросе

{ $and : 
    [{ 
     $and: 
     [ 
     {$or : [ { $where: '?0 == null' } , { a : ?0 }]}, 
     {$or : [ { $where: '?1 == null' } , { b : ?1 }]}, 
     {$or : [ { $where: '?2 == null' } , { c : ?2 }]} 
     ] 
    }] 
} 

В моем случае поле a фактически проходит в виде коллекции, мне нужно, чтобы найти те объекты в MongoDB с поданной a является $in коллекцией я прошел в.

Я пытался что-то вроде этого

{ $and : 
     [{ 
      $and: 
      [ 
      {$or : [ { $where: '?0 == null' } , { a : { $in : ?0 }}]}, 
      {$or : [ { $where: '?1 == null' } , { b : ?1 }]}, 
      {$or : [ { $where: '?2 == null' } , { c : ?2 }]} 
      ] 
     }] 
    } 

Однако я NPE для этого КН ru Я перехожу в коллекцию null.

ответ

0

Вам необходимо проверить длину сбора, как показано здесь spring-data-mongo - optional query parameters? Вы также можете избавиться от верхнего уровня $ и.

{ $and : 
     [ 
     {$or : [ { $where: '?0.length == 0' } , { a : { $in : ?0 }}]}, 
     {$or : [ { $where: '?1 == null' } , { b : ?1 }]}, 
     {$or : [ { $where: '?2 == null' } , { c : ?2 }]} 
     ] 
} 
0

Вы на самом деле не можете использовать $ в необязательном параметр списка, потому что, если не указано будет утратившими $ в принимают только список. Для этого Вы должны добавить [] вокруг необязательного параметра списка, а затем расплющить этот список так:

{ $and : 
    [ 
    {$or : [ { $where: '?0 == null;' }, 
      { $where: '[].concat.apply([],[?0]).indexOf(this.a) !== -1;'}]}, 
    {$or : [ { $where: '?1 == null' } , { b : ?1 }]}, 
    {$or : [ { $where: '?2 == null' } , { c : ?2 }]} 
    ] 
} 

использование, что для Монго версии < 3.4 и 3.4, так как Вы можете использовать функцию includes вместо indexOf

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