1

У меня есть документ MongoDB, который структурирован аналогично нижеприведенной структуре. Я ищу на основе people.search_columns.surname и people.columns.givenname. Например, когда я ищу имя «Валентина», я хочу вернуть документ, но Николаса Барсалу не следует включать.MongoDB поиск вложенных объектов, соответствующих критериям

Структура данных:

[_id] => MongoId Object (
    [$id] => 53b1b1ab72f4f852140dbdc9 
) 
[name] => People From 1921 
[people] => Array (
    [0] => Array (
     [name] => Barada, Valentine 
     [search_columns] => Array (
      [surname] => Array (
       [0] => Mardan, 
       [1] => Barada 
      ) 
      [givenname] => Array (
       [0] => Valentine 
      ) 
     ) 
    ) 
    [1] => Array (
     [name] => Barsaloux, Nicholas 
     [search_columns] => Array (
      [surname] => Array (
       [1] => Barsaloux 
      ) 
      [givenname] => Array (
       [0] => Nicholas 
      ) 
      [place] => Array (
      ) 
     ) 
    ) 
) 

Вот код, я работал на:

$criteria = array("people" => array(
     '$elemMatch' => array("givenname" => "Valentine") 
)); 

$projection = array("people" => true); 

$documents_with_results = $db->genealogical_data->find($criteria, $projection)->skip(0)->limit(5); 

В настоящее время этот код возвращает нулевой результат.

ответ

3

Поскольку массивы вложенные, вы не можете использовать базовую проекцию, как вы можете найти. Кроме того, чтобы «фильтровать» содержимое массива из документа, вам нужно сначала «размочить» содержимое массива. Для этого используется каркас агрегации:

$results = $db->genealogical_data->aggregate(array(
     array('$match' => array(
      'people.search_columns.givenname' => 'Valentine' 
     )), 
     array('$unwind' => '$people'), 
     array('$match' => array(
      'people.search_columns.givenname' => 'Valentine' 
     )), 
     array('$group' => array(
      '_id' => '$id', 
      'name' => array('$first' => '$name'), 
      'people' => array('$push' => '$people') 
     )) 
    )); 

Точка первого $match этапе является сокращение документов, которые, возможно, соответствуют вашим критериям. Второй раз выполняется после $unwind, где фактические элементы массива в документе «фильтруются» из результатов.

Окончательный $group возвращает исходный массив в нормальное состояние, минус элементы, которые не соответствуют критериям.

+0

Это сработало отлично. Спасибо! –

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

  • Нет связанных вопросов^_^