2016-01-21 63 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个条目时才会调用这个查询 –