MongoDB+Doctrine ODM 如何删除文档集合中嵌入的文档?
MongoDB+Doctrine ODM How to remove a embedded document in a document collection?
我正在使用 mongoDB 和 Doctrine ORM,并希望删除文档集合中的嵌入文档 "avatar"(或将其设置为空)。
我的 Json-对象如下所示:
{
"_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();
但它不起作用。我怎样才能获得头像密钥?
您可以在核心运算符中使用 $unset
的等效项来执行此示例。为了简洁和安全,我实际建议使用的地方:
$company = this->getQueryBuilder()
->findAndUpdate()
->field('stores._id')->equals($storeId)
->field('stores.$.contactPerson.avatar')->unsetField()->exists(true)
->getQuery()
->execute();
您只需保留 "stores" 数组中您真正想要的元素的 _id
值,这有助于匹配您需要删除该文档的数组元素的位置.
还使用 "dot notation" 作为嵌入文档路径。
"removes" 来自文档的 "key" 而不是仅仅将其设置为 null
。
如果你想要 "mutiple" 那么你想要 .update()
而不是 return 对象。
呃!
到select你刚用的东西:
$company = this->getQueryBuilder()
->find()
->field('stores._id')->equals($storeId)
->select('stores.$.contactPerson.avatar')-
->getQuery()
->execute();
我不知道这是否是最好的方法,但这对我有用
$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:感谢您的帮助:-)
我正在使用 mongoDB 和 Doctrine ORM,并希望删除文档集合中的嵌入文档 "avatar"(或将其设置为空)。
我的 Json-对象如下所示:
{
"_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();
但它不起作用。我怎样才能获得头像密钥?
您可以在核心运算符中使用 $unset
的等效项来执行此示例。为了简洁和安全,我实际建议使用的地方:
$company = this->getQueryBuilder()
->findAndUpdate()
->field('stores._id')->equals($storeId)
->field('stores.$.contactPerson.avatar')->unsetField()->exists(true)
->getQuery()
->execute();
您只需保留 "stores" 数组中您真正想要的元素的 _id
值,这有助于匹配您需要删除该文档的数组元素的位置.
还使用 "dot notation" 作为嵌入文档路径。
"removes" 来自文档的 "key" 而不是仅仅将其设置为 null
。
如果你想要 "mutiple" 那么你想要 .update()
而不是 return 对象。
呃!
到select你刚用的东西:
$company = this->getQueryBuilder()
->find()
->field('stores._id')->equals($storeId)
->select('stores.$.contactPerson.avatar')-
->getQuery()
->execute();
我不知道这是否是最好的方法,但这对我有用
$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:感谢您的帮助:-)