2016-01-21 62 views
2

我有一個MongoDb文檔有3個字段message,author,sendAt,我創建了一個查詢生成器來計算這個文檔上的所有數據庫條目,如果有超過20個條目,我試圖刪除最老的一個。學說刪除最古老的條目

sendAt是當前日期時間當郵件被髮送("sendAt" : ISODate("2016-01-21T08:53:00Z")

我有一個未完成的查詢生成器

public function deleteOldestMessage() 
{ 
    return $this->createQueryBuilder() 
     ->delete('m') 
     ->from('Messages', 'm') 
     ->where('m.sendAt = ') 
     ->execute(); 
} 

但我真的不知道我應該添加在where條件。 我也許應該訂購DESCsendAt字段並刪除列表中的第一個?

如何告訴查詢生成器刪除最舊的?

感謝,

回答

2

你可以嘗試這樣的:

$qb = $em->createQueryBuilder(); 
$messages = $qb->select('m') 
    ->from('Messages', 'm') 
    ->orderBy('m.sendAt', 'ASC') 
    ->getQuery() 
    ->getResult() 
; 
// You will receive array where in the top will be the oldest message. 
if (count($messages) > 20) { 
    // And in your desired case, you can remove just one oldest message. 
    $messageToDelete = array_shift($messages); 
    $em->remove($lastMessage); 
    $em->flush(); 
} 
3

您需要先選擇最老的一個,那麼你可以刪除它是這樣的:

$qb->select('m') 
    ->from('Messages', 'm') 
    ->orderBy('m.sendAt', 'DESC'); 
    $messages = $qb->getResult(); 

thene

if(count($messages) >= 20){ 
     //get the first element of array which is the oldest one 
     $lastMessage = current($messages); 
     $em->remove($lastMessage); 
    } 
+0

什麼'超過20 entries' –

2

您使用SQL查詢構建器選項代替的MongoDB 。

return $this->createQueryBuilder() 
    ->remove() 
    ->sort('sendAt', 'asc') 
    ->getQuery() 
    ->getSingleResult() 
    ->execute(); 
+0

什麼'超過20 entries' –

+0

你說,你有一個查詢。首先進行計數查詢,如果有更多的20做第二個查詢。 – malcolm

+0

是的,我只有在有超過20個條目時纔會調用這個查詢 –