我需要限制学说 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 可以在不同语言中多次使用。我希望能够将结果限制为指定的语言。