1

我需要限制学说 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 顺便说一句。

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

所以我正在寻找的是一个学说 mongo DB 查询构建器,它能够只返回那些实际包含属性号为 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 可以在不同语言中多次使用。我希望能够将结果限制为指定的语言。

4

1 回答 1

0

您是否尝试过教义聚合生成器?这可能是一个解决方案的开始,尤其是使用unwind函数可以使您的变平并使查询更易于构建。

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

希望这会对你有所帮助!

于 2018-02-12T11:21:02.110 回答