获取在 Symfony3 存储库中创建的 MongoDB 文档的 ID

Get id of the MongoDB document created in a Symfony3 repository

在我的 Symfony3 项目中,我确实有一些文档,例如 User,如下所述:

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;
}

而不是 returning true,我想 return 我刚刚创建的文档的 ID.

寻找答案,我找到了这段代码:

$this->getDocumentManager()->getConnection()->lastInsertId

不幸的是,return不是我要找的东西:

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 键下)并且 return 已知价值。此外,当您插入未明确设置标识符的文档时,这正是底层 MongoDB 驱动程序在幕后所做的(参见 this doc example

MongoDB 驱动程序将 ID 写入传入的数组中,但由于查询对象的结构,您看不到它。您可以从 getQuery():

返回的查询对象中获取它
$query = $queryBuider->getQuery();
$query->execute();

$id = $query->getQuery['newObj']['_id'];

但是请注意,这在未来的版本中不一定有效,因为新的 MongoDB 驱动程序(将从 ODM 2.0 开始使用)没有此功能。