获取在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)没有这个功能。