带有编号索引的doctrine mongodb查询构建器投影

时间:2018-01-16 13:13:10

标签: php mongodb symfony doctrine-odm akeneo

我需要限制doctrine mongoDB查询返回的数据量。 我可以使用select投影到简单字段甚至简单的嵌入数组字段,如normalizedData.ean。这非常有效。

但是我有以下形式的必要数据:

"values" : [
    {
        "_id" : ObjectId("59cbd73d83218bf7668b468d"),
        "attribute" : NumberLong("1"),
        "entity" : DBRef("pim_catalog_product", ObjectId("59148d2583218bf7508c1199"), "akeneo_pim"),
        "varchar" : "10011060"
    },
    {
        "_id" : ObjectId("59cbd73d83218bf7668b468e"),
        "attribute" : NumberLong("207"),
        "entity" : DBRef("pim_catalog_product", ObjectId("59148d2583218bf7508c1199"), "akeneo_pim"),
        "varchar" : "PRO70"
    },
    {
        "_id" : ObjectId("59cbd73d83218bf7668b468f"),
        "attribute" : NumberLong("110"),
        "entity" : DBRef("pim_catalog_product", ObjectId("59148d2583218bf7508c1199"), "akeneo_pim"),
        "option" : NumberLong("1890")
    }
]

该框架是Akeneo PIM btw。

所以这里的问题是,"values"没有通过我可以使用的唯一标识符编制索引,而是通过编号索引编制索引。我事先知道"attribute"号码,所以我可以查询。

所以我要找的是一个doctrine mongo数据库查询构建器,它只能返回实际包含属性号为110和207的值的实体,而且我只想返回这些值中的数据。

我有一个工作查询构建器,它使用唯一(字符串)索引:

$query = $productRepository->createQueryBuilder()
        ->hydrate(false)
        ->select(array('normalizedData.sku'))
        ->field('_id')->in($entityIds)
        ->limit($limit)
        ->skip($offset);

编辑:现在我找到了查询"values"的方法,但我不能使用此查询投影多个属性:

$qb = $productRepository->createQueryBuilder();
$query = $qb
    ->hydrate(false)
    ->select(array('normalizedData.sku'))
    ->selectElemMatch(
        'values',
        $qb->expr()->field('attribute')->in(array(117, 110))->addAnd(
            $qb->expr()->field('locale')->in(array('it_IT', 'de_DE'))
        ))
    ->field('_id')->in($entityIds)
    ->field('values')->elemMatch($qb->expr()->field('attribute')->in(array(117, 110)))
    ->limit($limit)
    ->skip($offset);

我想要到达的是两个属性(117和110),但我只得到一个。此外,我得到了一些结果,其中既没有属性存在,即使我想要过滤掉->field('values')->elemMatch($qb->expr()->field('attribute')->in(array(117, 110)))的那些。

显然,我还需要了解一些关于mongoDB的基础知识。任何形式的帮助将不胜感激。

我如何只获得那些在"值"中具有属性117和/或110的实体?集合,同时也只获取那些属性数据?

注意:可以使用不同语言多次使用相同的属性ID。我希望能够将结果限制为指定的语言。

1 个答案:

答案 0 :(得分:0)

您是否尝试了聚合构建器这个原则? 它可能是解决方案的开始,尤其是展开功能可以展平您的,使查询更容易构建。

https://doctrine-mongodb-odm.readthedocs.io/en/latest/reference/aggregation-builder.html

希望这会对你有帮助!