我需要限制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。我希望能够将结果限制为指定的语言。
答案 0 :(得分:0)
您是否尝试了
https://doctrine-mongodb-odm.readthedocs.io/en/latest/reference/aggregation-builder.html
希望这会对你有帮助!