尽管查询相同,但查找结果和聚合结果会有所不同

时间:2014-07-09 14:38:51

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

我正在尝试搜索结构如下的文档内的人员。在我的"发现"功能,我会得到10个结果。但是,我的聚合返回少于那个(大约7,但似乎取决于数据)。我已经尝试循环遍历test_find的结果,并添加了' $和'基于test_find结果的ID的规定,但在某些情况下,即使在find()语句中使用相同的查询,它也不会返回任何找到的结果。

JSON对象结构:

{
    id: "53b563c372f4f85b787b23c8",
    n: "Organization Name"
    fn: "filename.csv"
    p: [ // array of people
        {
            given_name: "John",
            surname: "Smith",
            sc: { // there is actually more data, but only the .sc. data is relevant to search
                g: "John",
                s: "Smith"
            }
        }
    ]
}

当前代码:

/***** $search_column_query dump ********/
{
    '$and': {
        { "p.sc.s": "Smith" },
        { "p.sc.g": "John" }
    }
}
/**************************************/

$test_find = $db->genealogical_data->find($search_column_query)->limit(10);

// This gets 10 results of documents matching the search query
foreach ($test_find as $result) { 
    var_dump($result["n"]); // "n" is the name
}



// This gets less than 10 (7 in the case of John Smith) results of documents matching the search query
$aggregation = array(
        array( '$match' => $search_column_query ), 
        array( '$limit' => 10 ),
        array( '$unwind' => '$p' ),
        array( '$match' => $search_column_query),
        array( '$group' => array(
            '_id' => '$n',
            'filename' => array( '$first' => '$fn' ),
            'people' => array( '$push' => '$p' )
        )),
        array( '$sort' => array('_id' => 1) ),
    );
$documents_with_results = $db->genealogical_data->aggregate($aggregation);

似乎我的搜索查询根本就错了,或者在聚合中使用不正确。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您在find中使用的查询不正确 您应该使用$elemMatch operator来确保您的两个条件与同一子文档/元素匹配。

{" p":{" $ elemMatch":                     {" sc.s":" Smith"," sc.g":" John" }            }  }

由于您$unwind首先进行汇总,因此您的查询最终会正确,因为它会自动应用于单个数组元素。