2014-02-13 28 views
0

我真的堅持像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 ..」,這樣就可以。

你能幫我解決這個問題嗎?

回答

0

問題是我試圖檢查所有的組合。這是一個st * pid錯誤。

爲了得到我預期的結果,我改變了:

   array('from_group' => $hangoutA), 
       array('from_group' => $hangoutB), 
       array('to_group' => $hangoutA), 
       array('to_group' => $hangoutB), 

   array('to_group' => $hangoutA), 
       array('to_group' => $hangoutB), 

容易,對不對?

對不起!

+0

這可能不是你想要的。第一個案例返回考慮的最後一條消息(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

0

這看起來像一個簡單的查詢,我不需要聚合框架。 (您是否因爲某些特定的原因使用了聚合框架?)

我沒有進入php,因此我將使用mongo控制檯語法。

要找到發送給一組的最後一條消息:

db.messages.find({"to_group" : groupID}).sort({"sent_time" : -1}).limit(1) 

找出2組之間的最後一條消息:

db.messages.find({"$or" : [{"to_group" : groupA, "from_group" : groupB}, {"to_group" : groupB, "from_group" : groupA}]}).sort({"sent_time" : -1}).limit(1)