使用Doctrine mongodb odm查询嵌套在数组中的文档

时间:2018-02-16 16:19:26

标签: php mongodb doctrine doctrine-odm

我想用Document Nested in an Array queries

执行Doctrine mongodb odm query builder

我的基本结构类似于:

  

db.inventory.insertMany([

     

{item:“journal”,instock:[{仓库:“A”,数量:5},{   仓库:“C”,数量:15}]},

     

{item:“notebook”,instock:[{仓库:“C”,数量:5}]},

     

{item:“postcard”,instock:[{仓库:“B”,数量:15},{   仓库:“C”,数量:35}]}

     

]);

我想在查询构建器

中执行此shell查询
  

db.inventory.find({“instock”:{仓库:“A”,数量:5}})

我试过这个,但这不起作用,因为它忽略了'instock'字段。

  

$ QB->字段( '的inStock') - >字段( '仓库') - >等于( 'A') - >字段( '数量') - >等于(5)

请记住,请执行以下操作

  

$ QB->字段( 'instock.warehouse') - >等于( 'A') - >字段( 'instock.qty') - >等于(5)

是一个不同的逻辑(check second example),因为它不一定匹配相同的嵌入文档。

我可以使用$ where和一个循环实现它,但它很丑陋而且很慢。任何更好的想法?

2 个答案:

答案 0 :(得分:1)

ODM通过查询构建器支持嵌入式文档,因此您可以执行以下操作:

$qb->field('instock')->equals(new InStock('A', 5));

如果使用对象不是您想要的,我认为您可以取消关联数组而不是new InStock()

答案 1 :(得分:1)

使用$ elemMatch,这是解决此问题的方法:

$qb->expr()->field('instock')->elemMatch(
        $qb->expr()
            ->field('warehouse')->equals('A')
            ->field('qty')->equals(5)
);