0

我有这个课程(我的真实课程的简化版本......):

/**
 * Description of A
 *
 * @ODM\Document(collection="A")
 */
class A {

  /** @ODM\Id(name="_id") */
  private $id;

  /**
   * @ODM\Field(type="collection")
   */
  private $names;

  /**
   * @ODM\ReferenceMany(targetDocument="B", storeAs="id", cascade={"persist"}) 
   */
  private $hasManyB;
}

我想更新A由 $oid 标识的对象,其hasManyB属性设置B为由 $oid1 和 $oid2 标识的两个类对象的数组:

$oid = new \MongoDB\BSON\ObjectId('5e8af06ec8a067559836e856');
$oid1 = new \MongoDB\BSON\ObjectId('5e8af06ec8a067559836e855');
$oid2 = new \MongoDB\BSON\ObjectId('5e8af066c8a067559836e854');

$newObj = [
  'id' => $oid,
  'names' => ['alfa','beta','gamma'],
  'hasManyB' => [$oid1, $oid2]
];

$query_builder = $this->_dm->createQueryBuilder(A::class);
$object = $query_builder->findAndUpdate()
      ->field('id')->equals($oid)
      ->setNewObj($newObj)
      ->returnNew()
      ->getQuery()  
      ->execute();

为 $newObj 中的每个元素调用方法prepareQueryOrNewObj(),并将两个 ObjectId 的数组传递给返回一个新的 ObjectId,这是保存后 mongo db 中的结果对象:DocumentPersisterprepareQueryElement()getDatabaseIdentifierValue()

{
  "_id" : ObjectId("5e8af06ec8a067559836e856"),
  "hasManyB" : ObjectId("5c3f21b67d97cb3a08e7411f"),
  "names": [
    "alfa",
    "beta",
    "gamma"
  ]
}

对我来说这毫无意义。显然我做错了什么。使用 setNewObj in 更新 ReferenceMany 属性的正确方法是findAndUpdate什么QueryBuilder?请注意,我对基于操作 php 对象并使用persist()of保存它的替代方法不感兴趣DocumentManager(我知道它有效)。在 mongo shell 中,正确/等效的命令是:

db.A.findOneAndUpdate({
    _id:ObjectId("5e8af06ec8a067559836e856")
  }, {
    $set:{
      names:["alfa","beta","gamma"],
      hasManyB:[
        ObjectId("5e8af06ec8a067559836e855"),
        ObjectId('5e8af066c8a067559836e854')
      ]
    }
  })
4

0 回答 0