我正在尝试搜索结构如下的文档内的人员。在我的"发现"功能,我会得到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);
似乎我的搜索查询根本就错了,或者在聚合中使用不正确。非常感谢任何帮助。
答案 0 :(得分:1)
您在find
中使用的查询不正确
您应该使用$elemMatch
operator来确保您的两个条件与同一子文档/元素匹配。
{" p":{" $ elemMatch": {" sc.s":" Smith"," sc.g":" John" } } }
由于您$unwind
首先进行汇总,因此您的查询最终会正确,因为它会自动应用于单个数组元素。