Php 使用ODM从mongodb文档的数组中删除项

Php 使用ODM从mongodb文档的数组中删除项,php,mongodb,doctrine,doctrine-odm,Php,Mongodb,Doctrine,Doctrine Odm,我有一个mongoDB文档,包含以下结构: { "_id" : ObjectId("537b9731fa4634134c8b45aa"), "kpis" : [ { "id" : 4, "value" : 3.78, "entered" : Timestamp(1401377656, 9)

我有一个mongoDB文档,包含以下结构:

{
        "_id" : ObjectId("537b9731fa4634134c8b45aa"),
        "kpis" : [
                {
                        "id" : 4,
                        "value" : 3.78,
                        "entered" : Timestamp(1401377656, 9)
                }
        ]
}
我想删除id为x的所有kpi文档。直接使用pull命令在数据库上执行此操作非常简单:

db.lead.update({}, {$pull:{"kpis":{id:5}}}, {multi:true});
但是,我(多次)尝试使用ODM原则匹配此语法失败:

    $qb->update()
       ->field('kpis')
       ->pull($qb->expr()->field('kpis.id')->equals($kpi->getId()))
       ->multiple(true)
       ->getQuery()
       ->execute();

    // I've also tried..

    $qb->update()
       ->field('kpis')
       ->pull($qb->expr()->field('kpis')->elemMatch(
            $qb->expr()->field('kpis.id')->equals($kpi->getId())
        ))
       ->multiple(true)
       ->getQuery()
       ->execute();

没有任何东西被移除。我是否正确使用了查询生成器?

我相信您希望执行以下操作:

$qb->update()
    ->field('kpis')->pull(array('id' => $kpi->getId()))
    ->multiple(true)
    ->getQuery()
    ->execute();
您可以使用
Query::debug()
方法转储由该方法生成的实际查询。在转储的
newObj
字段中,您应该看到以下内容:

{ "$pull": { "kpis": { "id": <number> }}}
在这里,您将创建以下查询:

{ "$pull": { "kpis": { "kpis.id": <number> }}}
{ "$pull": { "kpis": { "$elemMatch": { "kpis.id": <number> }}}}
这将生成以下查询:

{ "$pull": { "kpis": { "kpis.id": <number> }}}
{ "$pull": { "kpis": { "$elemMatch": { "kpis.id": <number> }}}}
{“$pull”:{“KPI”:{“$elemMatch”:{“kpis.id”:}}

我以前从未见过这样的语法,但我认为
$elemMatch
是超级棒的,因为它已经将匹配数组元素的条件作为参数。在查询中,当您直接在数组字段上进行匹配,而不是对数组元素进行完全相等匹配(即,您希望提供条件而不是精确匹配)时,此选项非常有用

谢谢,为我工作<代码>->field('categories')->pull([''id'=>newobjectid($categoriesID)])