繁体   English   中英

主义Mongodb ODM elemMatch()

[英]Doctrine Mongodb ODM elemMatch()

我有以下类别的集合。

 {
   "_id": ObjectId("5353a17dfcda358c1050d1ed"),
   "name": "Motorcyles",
   "tags": {"Vehicle","two wheeler","Bikes"}
 },
 {
   "_id": ObjectId("5353a17dfcda358c105bde4c"),
   "name": "Automobiles",
   "tags": {"Vehicle","Cars","Bikes", "two wheeler", "four wheeler"}
 },
 {
   "_id": ObjectId("5353a17dfcda358c105fd5e701),
   "name": "Cars",
   "tags": {"Vehicle","Cars","four wheeler"}
 }

现在,我想使用主义的ODM查询构建器列出类别,并过滤与名称或存储在标签中的值匹配的类别。 (即,当搜索文本为car时,结果应为两类-汽车和汽车,因为汽车在标签中有汽车,并且有一个名称为汽车的类别)。

希望您了解情况。

我正在使用Symfony2和doctrine-odm。 我尝试使用elemMatch(),但找不到解决方案。 我只有键和值的索引数组得到了解决方案。 但是就我而言,标签包含没有键的数组。

谁能帮忙。

如果标签只是一个数组,则可以将其视为查询中的文本字段。 您可以这样做:

$qb = $this->createQueryBuilder('App:Something');
$qb->field('tags')->equals('Cars');

然后它将搜索标签。

在您的情况下,您可能需要一个正则表达式,并且可能要使用“或”运算符来搜索任意一个字段。 在这种情况下,您必须使用addOr()。

$qb->addOr($qb->expr()->field('tags')->equals(new \MongoRegex("/Cars/i")));
$qb->addOr($qb->expr()->field('name')->equals(new \MongoRegex("/Cars/i")));

可以在http://www.jamiesutherland.com/2011/07/01/doctrine-2-odm-querybuilder-addor/MongoDB / doctrine中找到示例:不能在$ and中嵌套$或

请注意,由于使用了正则表达式,因此这是性能杀手。 另请注意,如果您不使用正则表达式,但未在name, tags上定义复合索引,则它也将是性能的杀手。 它必须是在两个字段上的一个索引,在您的Doctrine文档的顶部定义中定义,因此在“ class Something”之前。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM