在我的 Symfony3 项目中,我确实有一些文档,例如用户,如下所述:
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;
}
我想返回我刚刚创建的文档的ID ,而不是返回true
。
寻找答案,我找到了这段代码:
$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();
}
答案 0 :(得分:1)
解决问题的最简单方法是通过调用new \MongoId()
生成标识符,将其添加到您要插入的数据(在_id
键下)并返回已知值。当你在没有明确设置标识符的情况下插入文档时,这正是幕后的MongoDB驱动程序所做的事情(参见this doc example)
答案 1 :(得分:0)
MongoDB驱动程序将ID写入正在传入的数组中,但由于查询对象的结构,您没有看到它。您可以从getQuery()
:
$query = $queryBuider->getQuery();
$query->execute();
$id = $query->getQuery['newObj']['_id'];
但请注意,这不一定适用于将来的版本,因为新的MongoDB驱动程序(将从ODM 2.0开始使用)不具备此功能。