我在MongoDB中使用Doctrine。通常我不关心ID,但在一种情况下我需要在刷新之前使用ID以避免不必要的往返。所以我添加了ID策略“NONE”并在构造函数中设置ID。但之后我无法通过其ID加载文档。
加载文档的代码:
/* @var $userRepo DocumentRepository */
$userRepo = $managerRegistry->getRepository(User::class);
$qb = $userRepo->createQueryBuilder();
$qb->field('id')->in(['5cb6377ae0b68801bc3b1771']);
$user = $qb->getQuery()->execute()->getSingleResult();
var_dump($user instanceof User);
/* @var $userRepo DocumentRepository */
$userRepo = $managerRegistry->getRepository(User::class);
$users = $userRepo->findBy(['id' => '5cb6377ae0b68801bc3b1771']);
var_dump(count($users) === 1);
/* @var $userRepo DocumentRepository */
$userRepo = $managerRegistry->getRepository(User::class);
$user = $userRepo->find('5cb6377ae0b68801bc3b1771');
var_dump($user instanceof User);
(实际上是虚假,虚假,错误 - 预期是真实,真实,真实)
文献:
/**
* @ODM\Document
*/
class User
{
/**
* @ODM\Id(strategy="NONE")
*/
protected $id;
public function __construct()
{
$this->id = new \MongoId();
}
...
}
发生这种情况是因为您在查找调用中使用了一个字符串。您需要使用MongoId
,因为这是您的标识符。所以:
/* @var $userRepo DocumentRepository */
$userRepo = $managerRegistry->getRepository(User::class);
$user = $userRepo->find(new \MongoId('5cb6377ae0b68801bc3b1771'));