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

Query for a Document Nested in an Array using Doctrine mongodb odm

我要执行Document Nested in an Array queries with the Doctrine mongodb odm query builder

我的结构基本上类似于:

db.inventory.insertMany( [

{ item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] },

{ item: "notebook", instock: [ { warehouse: "C", qty: 5 } ] },

{ item: "postcard", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }

]);

我想在查询构建器中执行此 shell 查询

db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )

我已经试过了,但这行不通,因为它忽略了字段 'instock'。

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

请记住执行以下操作

$qb->field('instock.warehouse')->equals('A')->field('instock.qty')->equals(5)

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

我可以使用 $where 和一个循环来实现它,但是它很丑而且很慢。有更好的主意吗?

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

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

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

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

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