我有这个课程(我的真实课程的简化版本......):
/**
* 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 中的结果对象:DocumentPersister
prepareQueryElement()
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')
]
}
})