在MongoDB文档中查找匹配的数组项

时间:2012-03-15 13:06:39

标签: codeigniter mongodb

我正在使用Codeigniter和MongoDB开发一个Web应用程序。 在数据库中,我得到了一个如下所示的文档:

{
    "_id": {
        "$id": "4f609932615a935c18r000000"
    },
    "basic": {
        "name": "The project"
    },
    "members": [
        {
            "user_name": "john",
            "role": "user",
            "created_at": {
                "sec": 1331730738,
                "usec": 810000
            }
        },
        {
            "user_name": "markus",
            "role": "user",
            "created_at": {
                "sec": 1331730738,
                "usec": 810000
            }
        }
    ]
}

我需要使用user_name和role搜索此文档。现在当我使用下面的代码时,我得到了两个。我只想获得与user_name和role匹配的数组项。

$where = array (

    '_id' => new MongoId ($account_id), 

    'members.user_id' => new MongoId ($user_id),

    'members.role' => $role

);

$this -> cimongo -> where ($where) -> count_all_results ('accounts');

2 个答案:

答案 0 :(得分:4)

这是一个老问题,但是从MongoDB 2.2开始,您可以在投影中使用$ positional operator,这样只有匹配的数组元素才会包含在结果中。

所以你可以这样做:

$this->cimongo->where($where)->select(array('members.$'))->get('accounts');

答案 1 :(得分:2)

这是这个问题的重复:

Get particular element from mongoDB array

您也可以使用$ elemMatch

http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray

这就是问题 - 您无法获得匹配的数组项,因为如果这些元素匹配,mongo将返回整个文档。您将不得不解析代码客户端。 Mongo没有办法回答,“只返回匹配的数组。”