我有一个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);
目前该代码返回零结果。
答案 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
将原始数组恢复正常,减去与条件不匹配的项目。