使用 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)
);
我要执行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)
);