我正在使用带有Doctrine ORM的mongoDB,并希望在文档集合中删除嵌入文档“avatar”(或将其设置为null)。
我的Json-Object看起来像这样:
{
"_id" : ObjectId("55965d090203ff700f000032"),
"name" : "test",
"stores" : [
{
"_id" : ObjectId("559d166f0203ff081300002f"),
"storeName" : "test",
"openingTimes" : "",
"address" : {
...
},
"contactPerson" : {
"firstname" : "",
"lastname" : "",
...
"avatar" : {
"source" : "/uploads/images/company/55965d0980585/contactPerson/",
"name" : "contactperson.jpg"
}
}
},
...
]
}
我正在使用queryBuilder并尝试这样的事情
$company = $this->getQueryBuilder()
->findAndUpdate()
->field('stores')->equals($store)
->field('contactPerson.avatar')->set(null)
->getQuery(array('multiple' => true))
->execute();
但它不起作用。如何才能访问头像密钥?
答案 0 :(得分:1)
我不知道这是否是最好的方式,但这个适用于我
$company = $this->getQueryBuilder()
->findAndUpdate()
->field('_id')->equals($company->getId())
->field('stores.'.$key.'.contactPerson.avatar')->set(null)
->getQuery()
->execute();
第3行:通过id(不存储)获取父对象
第4行:通过$ key获取商店。然后我可以使用 - > set(null)将嵌入的对象设置为null或使用
->field('stores.'.$key.'.contactPerson.avatar')->unsetField()->exists(true)
@Blakes Seven:感谢您的回答: - )
答案 1 :(得分:0)
您可以在核心运算符中使用等效的$unset
来执行此示例。我实际上建议使用的简洁性和安全性:
$company = this->getQueryBuilder()
->findAndUpdate()
->field('stores._id')->equals($storeId)
->field('stores.$.contactPerson.avatar')->unsetField()->exists(true)
->getQuery()
->execute();
您只需保留" store"中元素的_id
值。你真正想要的数组,这有助于匹配你需要删除该文档的数组元素的位置。
还使用"dot notation"作为嵌入式文档路径。
"删除" "键"从文档中而不是仅将其设置为null
。
如果你想" mutiple"那么你想要.update()
,但这不会返回对象。
Ughh!
选择您刚才使用的东西:
$company = this->getQueryBuilder()
->find()
->field('stores._id')->equals($storeId)
->select('stores.$.contactPerson.avatar')-
->getQuery()
->execute();