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:感谢您的帮助:-)