Php 使用ODM从mongodb文档的数组中删除项
我有一个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)
{
"_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)])