获取在Symfony3库中创建MongoDB的文档的ID
问题描述:
在我Symfony3项目,我确实有一些文件,如用户,说明如下:获取在Symfony3库中创建MongoDB的文档的ID
UserBundle\Document\User:
repositoryClass: UserBundle\Repository\UserRepository
fields:
userId:
id: true
email:
type: string
firstName:
type: string
lastName:
type: string
一段时间,我想创建一个用户文档通过用户存储库。 围绕createQueryBuilder()工作,我已经建立了这个方法:
public function insert($email, $firstName, $lastName)
{
$data = array('email' => $email,
'firstName' => $firstName,
'lastName' => $lastName,
);
/* Create query */
$query = $this->createQueryBuilder();
/* Add Data */
$query
->insert()
->setNewObj($data);
/* Return */
$query
->getQuery()
->execute();
return true;
}
而不是返回true
,我想回到我刚刚创建文件的ID。
为了寻找答案,我发现这段代码:
$this->getDocumentManager()->getConnection()->lastInsertId
不幸的是,它没有返回我所期待的:
object(MongoDB)[307]
public 'w' => int 1
public 'wtimeout' => int 10000
感谢您的帮助!
编辑:
这里是在接受的答案提出的建议更新代码:
public function insert($email, $firstName, $lastName)
{
$id = new MongoId();
$data = array(
'_id' => $id,
'email' => $email,
'firstName' => $firstName,
'lastName' => $lastName,
);
/* Create query */
$query = $this->createQueryBuilder();
/* Add Data */
$query
->insert()
->setNewObj($data);
/* Return */
$query
->getQuery()
->execute();
return $id->__toString();
}
答
为您解决问题最简单的方法是产生标识符前期通过调用new \MongoId()
,将它添加添加到您要插入的数据(在_id
密钥下)并返回已知值。这也正是MongoDB驱动程序在幕后插入没有明确设置标识符的文档时所做的事情(请参阅this doc example)
答
MongoDB驱动程序将ID写入正在传入的数组中,但是您没有看到它由于查询对象的结构。您可以从由getQuery()
返回的查询对象得到它:
$query = $queryBuider->getQuery();
$query->execute();
$id = $query->getQuery['newObj']['_id'];
不过请注意,这不会在将来的版本一定的工作,因为新的MongoDB驱动程序(将用于开始ODM 2.0)没有这个功能。