4

MongoDB には、ネイティブ MongoDB クエリで正常にクエリできるデータ モデルがあります。しかし、Doctrine MongoDB ODM の Query Builder API でそれらを表現することはできません。

これは私のモデルがMongoDBでどのように見えるかです(これはJSONコードの例です):

{ "name": "ArticleName", 
  "features": {
    { "type": "color",
      ...
      "values": {
        { "value": "RED", 
          "label": "red",
          ....
        },

        { "value": "GREEN", 
          "label": "green" }
      } 
    },
    { "type": "width",
      "values": {
        { "value": "40"}
      } 
    }
  }
}

さまざまな特徴と値の組み合わせを検索して記事を見つけたい。たとえば、color=green で width=40 の記事を見つけたい。

しかし、Doctrine MongoDB ODM Query Builder API** を使用してそのためのクエリを作成できませんでした? これは私が試したものです:

# Document/ArticleRepository.php    

$features = array('color'=>'RED', 'width'=>'40');
$qb = $this->createQueryBuilder('CatalogBundle:Article'); // I use symfony 2
foreach ($features as $type => $value)
{
    $qb->field('features')->elemMatch(
        $qb->expr()->field('type')->equals($type)->field('values')->elemMatch(
            $qb->expr()->field('value')->equals($value)
        )
    );
}
return $qb->getQuery()->execute();

ただし、これは 1 つの条件のみを含むクエリになります。他の条件は上書きされるようです。これは、クエリ ビルダーによって生成されたクエリです。

db.articles.find({ "features": { "$elemMatch": { "type": "width", "values": { "$elemMatch": { "value": 40 } } } } })

MongoDB ODM クエリ ビルダー API を使用してユース ケースを解決する方法はありますか?

4

1 に答える 1

5

その間、$all-Operatorを使用して問題を解決しました。DoctrineMongoDB-Methodに渡される式の配列を作成しall()ます。上記で試した戦略$elemMatchは、MongoDBでも機能しませんでした。式を配列に書き込めるようにするには、最後に-> getQuery()を追加する必要があります。何らかの理由で式はまだ文書化されていませんが、ソースコードでそれらの機能を確認できます。

# Document/ArticleRepository.php

$features = array('color'=>'RED', 'width'=>'40');
$qb = $this->createQueryBuilder('CatalogBundle:Article');
$all_features[] = array();

foreach ($features as $templateID => $value)
{
    # Add expression as a subquery to array
    $all_features[] = $qb->expr()->elemMatch(
        $qb->expr()->field('templateID')->equals($templateID)->field('values')->elemMatch(
            $qb->expr()->field('value')->equals($value)
        )
    )->getQuery();
}
# Add expressions to query
$qb->field('features')->all($all_features);

式は、クエリを作成するときに使用できるほとんどすべてのメソッドをサポートします。複数の式をインターレースすることで、MongoDBリクエストを作成できます。これにより、配列を-Methodに渡すだけで、他の方法で構築できる複雑なMongoDBクエリを構築できます。findBy()ただし、Doctrine ODMの現在のバージョン(ベータ2)では、この戦略では、のようなメソッドをMongoDBチェーンに追加することはできません.limit()

したがって、式はDoctrineMongoDBを使用して複雑なクエリを構築するための最良の戦略のように見えます。

于 2011-04-28T01:19:46.300 に答える