MongoDB查找符合条件的嵌套对象

时间:2014-06-30 21:39:58

标签: mongodb mongodb-query aggregation-framework mongodb-php

我有一个MongoDB文档,结构类似于下面的结构。我正在基于people.search_columns.surname和people.columns.givenname进行搜索。例如,当我搜索" Valentine"的给定名称时,我想要取回文件,但不应包括Nicholas Barsaloux。

数据结构:

[_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); 

目前该代码返回零结果。

1 个答案:

答案 0 :(得分: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将原始数组恢复正常,减去与条件不匹配的项目。