0

「1 対多」関係の検索フォーム/基準を作成するにはどうすればよいですか。たとえば、「群衆が 10.000 を超えるすべてのチームを選択する」としましょう。

MongoDbの基本的なアクティブ レコードとしてMongoRecord 拡張機能 ( http://www.yiiframework.com/extension/mongorecord/ ) を使用しています。

mongo db のコレクションに基づいて、Yii で GridView を作成しました (私にとってはうまくいきます)。私のドキュメントのコレクションの 1 つは、次のような構造になっています。

{
_id":1,
"teamId":2453,
"teamName":"Team A",
"competition":["Competition A","Competition B"],
"matches":
    [
        {
            "_id":147852,
            "crowd":10234,
            "yellowCards":2,
            "scorers" [{....}]
            ....
        }
    ]
...
}

私の文書:

$teams = MongoTeam::model()->findAll();    

My dataProvider is:
$dataProvider=new CArrayDataProvider($teams, array(
        'id'=>'_id',
        'sort'=>array(
            'attributes'=>array(
                 '_id', 'teamId', 'teamName', 'matches', ...
            ),
        ),
        'pagination'=>array(
            'pageSize'=>20,
        ),
    ));
    $this->render('index', array('dataProvider'=>$dataProvider));

ビューには、次のようなものがあります。

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
    'columns'=>array(
        array(
            'name' => 'Team ID',          
            'type' => 'raw',
            'value' => 'CHtml::encode($data->teamID)'
        ),
        array(
            'name' => 'Team Name',          
            'type' => 'raw',
            'value' => 'CHtml::encode($data->teamName)'
        ),
        ...

しかし、サブドキュメントの条件を使用してフィルターを作成することはできません (私の場合: "一致")。他の mongoDB 拡張機能/モジュールなどは使用したくありません。英語が下手で申し訳ありません。

4

1 に答える 1

0
$query=array(
   'matches.crowd'=>array('$gt'=>10000),
   'matches.$'=>1
);
$teams = MongoTeam::model()->findAll($query);

こんな感じで使えます。しかし、そのようなデータ プロバイダーを使用してはなりません。$teams 変数に生成される行が多すぎるためです。データ プロバイダーの基準を使用する必要があります。私はYiiMongoDbSuiteでそれを行っています。これには、それを達成するための EMongoCriteria および EMongoDataProvider クラスがあります。

于 2013-04-10T22:37:05.090 に答える