MongoDB + Doctrine ODM如何删除文档集中的嵌入文档?

时间:2015-07-08 13:00:01

标签: php mongodb doctrine-odm

我正在使用带有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();

但它不起作用。如何才能访问头像密钥?

2 个答案:

答案 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();