使用Yii在Mongo db文档中搜索条件

时间:2013-04-10 21:40:25

标签: php mongodb yii yii-extensions

如何为“一对多”关系创建搜索表单/条件:让我们说“选择所有拥有人群的团队> 10.000”。

我使用MongoRecord扩展名(http://www.yiiframework.com/extension/mongorecord/)作为MongoDb的基本活动记录。

我基于mongo db的集合创建了一个带有Yii的GridView(它适用于我)。 我的一个文档集合有这样的结构:

{
_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扩展/模块等。 谢谢,抱歉我的英语不好。

1 个答案:

答案 0 :(得分:0)

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

你可以这样使用。但是你不能使用这样的数据提供者。因为它会在$ teams var中生成太多行。您必须使用数据提供者的标准。我正在用YiiMongoDbSuite做它,它有EMongoCriteria和EMongoDataProvider类来完成它。