我在MongoDB中有以下查询
$this->createQueryBuilder()
->field('actor')->in($actorIdArray)
->getQuery()
->execute();
其中,field actor是带注释的对象引用
@MongoDB\ReferenceOne(targetDocument="User", simple=true)
表示它将存储对象Id而不是完整引用。
$ actorIdArray是一个带有
形式的id数组["5706cb39821b166d3931f34f", "56015f7d4f8bd90b769e6e75"]
查询不返回任何内容,这是预期的,因为提交的actor包含对象id。
但是,如果我以这种方式构建数组
[new MongoId("5706cb39821b166d3931f34f"), new MongoId("56015f7d4f8bd90b769e6e75")]
它也不起作用,这对我来说非常令人惊讶。
日志显示查询已生成
{ "actor": {"$in":[{"$id":"5706cb39821b166d3931f34f"},{"$id":"56015f7d4f8bd90b769e6e75"}]}}
我认为它应该是这样的
{ "actor": {"$in":[ObjectId("5706cb39821b166d3931f34f"),ObjectId("56015f7d4f8bd90b769e6e75"]}}
不确定我做错了什么, 任何想法?
答案 0 :(得分:0)
Doctrine希望你的数组是一个文档数组。
您无需查询即可加载document references。
$dm = $this->get('doctrine.odm.mongodb.document_manager'):
$documents = array();
foreach($actorIdArray as $id){
$documents[] = $dm->getReference('AppBundle:Actor',$id); // <- this is the key
}
$this->createQueryBuilder()
->field('actor')->in($documents)
->getQuery()
->execute();
答案 1 :(得分:0)
正如您在Doctrine\ODM\MongoDB\Query\Builder
-> references
方法的代码源中看到的那样:
public function references(object $document) : self
{
$this->requiresCurrentField();
$mapping = $this->getReferenceMapping();
$reference = $this->dm->createReference($document, $mapping);
$storeAs = $mapping['storeAs'] ?? null;
$keys = [];
switch ($storeAs) {
case ClassMetadata::REFERENCE_STORE_AS_ID:
$this->query[$mapping['name']] = $reference;
return $this;
.....
return $this;
}
您必须知道引用的构建方式。通常,这是通过$id
完成的。
使用actor.$id
作为字段名称:
$dm = $this->get('doctrine.odm.mongodb.document_manager'):
$documents = array();
foreach($actorIdArray as $id){
$documents[] = new MongoDB\BSON\ObjectId($id);
}
$this->createQueryBuilder()
->field('actor.$id')->in($documents)
->getQuery()
->execute();