【问题标题】:MongoDB finding nested objects that meet criteriaMongoDB 查找符合条件的嵌套对象
【发布时间】:2014-06-30 21:39:57
【问题描述】:

我有一个 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); 

目前该代码返回零结果。

【问题讨论】:

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


    【解决方案1】:

    由于数组是嵌套的,因此您不能像使用 find 那样使用基本投影。此外,为了从文档中“过滤”数组内容,您需要先“展开”数组内容。为此,您使用聚合框架:

       $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 使原始数组恢复正常,减去不符合条件的项。

    【讨论】:

      猜你喜欢
      • 2020-01-24
      • 1970-01-01
      • 1970-01-01
      • 2016-03-05
      • 2017-11-16
      • 1970-01-01
      • 2018-09-10
      • 2021-04-16
      • 2016-12-19
      相关资源
      最近更新 更多