【问题标题】:Doctrine Mongodb ODM elemMatch()Doctrine Mongodb ODM elemMatch()
【发布时间】:2014-04-24 10:55:04
【问题描述】:

我有以下类别的集合。

 {
   "_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 查询构建器和过滤器列出与标签中存储的名称或值匹配的类别。 (即当搜索文本是汽车时,结果应该是两个类别 - 汽车和汽车,因为汽车在标签中有汽车,并且有一个名称为汽车的类别。

希望你了解情况。

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

谁能帮忙。

【问题讨论】:

    标签: mongodb symfony doctrine-orm


    【解决方案1】:

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

    $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: can't nest $or in $and找到示例

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

    【讨论】:

    • 这仅给出匹配名称字段的结果,仍然没有列出带有标签为“汽车”的类别。
    • 将标签的字段类型从“hash”更改为“collection”后,可以使用上述解决方案。谢谢@ErikDuindam
    猜你喜欢
    • 2015-04-10
    • 2017-08-13
    • 1970-01-01
    • 2016-08-26
    • 2017-08-14
    • 1970-01-01
    • 2014-04-19
    • 2016-06-26
    • 2012-09-06
    相关资源
    最近更新 更多