我真的堅持像6小時前這個問題。這真是令人沮喪。Mongodb:過濾與聚合得到最後的消息
這是我收集:
{
"_id" : ObjectId("52fbcd2aa0a9210007000038"),
"from_group" : "52faa17fa0a921740c000046",
"to_group" : "52faa173a0a921c807000037",
"message" : "How are you?",
"sent_time" : ISODate("2014-02-12T19:36:10.000Z"),
}
{
"_id" : ObjectId("52fbcd39a0a921641200002c"),
"from_group" : "52faa173a0a921c807000037",
"to_group" : "52faa17fa0a921740c000046",
"message" : "Fine, and you?",
"sent_time" : ISODate("2014-02-12T19:36:25.000Z"),
}
{
"_id" : ObjectId("52fbcd4ea0a9210007000039"),
"from_id" : "1305426002",
"from_group" : "52faa17fa0a921740c000046",
"to_group" : "52faa173a0a921c807000037",
"message" : "Fine",
"sent_time" : ISODate("2014-02-12T19:36:46.000Z"),
}
{
"_id" : ObjectId("52fbfa2aa0a921641200002d"),
"from_group" : "52fbfa1ca0a921f81300002a",
"to_group" : "52faa173a0a921c807000037",
"message" : "Test... 1.. 2.. 3..",
"sent_time" : ISODate("2014-02-12T22:48:10.000Z"),
}
這是我的代碼:
function getLastMessage($hangoutA, $hangoutB) {
$result = $mongodb->messages->aggregate(
['$match' =>
['$or' =>
[
array('from_group' => $hangoutA),
array('from_group' => $hangoutB),
array('to_group' => $hangoutA),
array('to_group' => $hangoutB),
]
]
],
[ '$group' => [
'_id' => null,
'message' => ['$last' => '$message']
]
]);
$message = $result;
return $message;
}
$first = getLastMessage("52faa173a0a921c807000037", "52fbfa1ca0a921f81300002a");
$second = getLastMessage("52faa173a0a921c807000037", "52faa17fa0a921740c000046");
$第一和$第二返回此: Array ([result] => Array ([0] => Array ([_id] => [message] => Test... 1.. 2.. 3..)) [ok] => 1)
與$第一個問題是,我期望的信息是:「好」。 我期望的$秒是:「Test ... 1 .. 2 .. 3 ..」,這樣就可以。
你能幫我解決這個問題嗎?
這可能不是你想要的。第一個案例返回考慮的最後一條消息(from_group == hangoutA)或(from_group == hangoutB)或(to_group == hangoutA)或(to_group == hangoutB)。我想你想要的是[(from_group == hangoutA)和(to_group == hangoutB)]或[(from_group == hangoutB)AND(to_group == hangoutA)] – joao