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

Php 使用Doctrine mongodb odm查询嵌套在数组中的文档,php,mongodb,doctrine,doctrine-odm,Php,Mongodb,Doctrine,Doctrine Odm,我想用 我的结构基本上类似于: db.inventory.insertMany([ {项目:“日记账”,库存:[{仓库:“A”,数量:5}{ 仓库:“C”,数量:15}]} {项目:“笔记本”,库存:[{仓库:“C”,数量:5}]} {项目:“明信片”,库存:[{仓库:“B”,数量:15}{ 仓库:“C”,数量:35}]} ])) 我想在查询生成器中执行这个shell查询 db.inventory.find({“instock”:{仓库:“A”,数量:5}) 我已经试过了,但它不起作用,因为它忽

我想用

我的结构基本上类似于:

db.inventory.insertMany([

{项目:“日记账”,库存:[{仓库:“A”,数量:5}{ 仓库:“C”,数量:15}]}

{项目:“笔记本”,库存:[{仓库:“C”,数量:5}]}

{项目:“明信片”,库存:[{仓库:“B”,数量:15}{ 仓库:“C”,数量:35}]}

]))

我想在查询生成器中执行这个shell查询

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

我已经试过了,但它不起作用,因为它忽略了字段“instock”

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

请记住,执行以下操作

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

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


我可以使用$where和一个循环来实现它,但它既丑陋又缓慢。有更好的想法吗?

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

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

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

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

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

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

,这是解决此问题的方法:

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

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

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

这样我就需要整个对象数据,我无法查找特定字段:(@volkovmqx很抱歉,使用数据中的所有字段进行查询时被误导了。您是否尝试过类似
$qb->field('instock')->equals(['warehouse'=>'a','qty'=>5]);
?是的,如果整个['warehouse'=>'a','qty'=>5],它会匹配]存在,并且顺序相同,所以['warehouse'=>'A']不起作用是的,这就是我解决这个问题的方法。我将以我需要整个对象数据的方式共享答案,我无法查找特定字段:(@volkovmqx很抱歉,被使用数据中所有字段的查询误导了。您尝试过类似
$qb->field('instock')的方法吗->等于(['warehouse'=>'A','qty'=>5]);
?是的,如果整个['warehouse'=>'A','qty'=>5]存在并且顺序相同,那么它将匹配,所以['warehouse'=>'A']不起作用是的,这就是我解决这个问题的方法。我将分享答案