我有一个包含3个字段message
,author
,sendAt
的MongoDb文档,我创建了一个查询构建器来计算此文档中的所有数据库条目,如果有超过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
条件下添加什么。
我应该订购DESC
sendAt
字段并删除列表中的第一个字段?
如何告诉查询构建器删除最旧的那个?
谢谢,
答案 0 :(得分: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);
}
答案 1 :(得分:2)
您使用sql查询构建器选项而不是mongodb。
return $this->createQueryBuilder()
->remove()
->sort('sendAt', 'asc')
->getQuery()
->getSingleResult()
->execute();
答案 2 :(得分: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();
}