【问题标题】:Find matching array items in MongoDB document在 MongoDB 文档中查找匹配的数组项
【发布时间】:2012-03-15 13:06:38
【问题描述】:

我正在使用 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
            }
        }
    ]
}

我需要同时使用用户名和角色来搜索此文档。现在,当我使用下面的代码时,我得到了两者。我只想获取同时匹配用户名和角色的数组项。

$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');

【问题讨论】:

    标签: codeigniter mongodb


    【解决方案1】:

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

    所以你可以这样做:

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

    【讨论】:

      【解决方案2】:

      这是对这个问题的重复:

      Get particular element from mongoDB array

      你可能还想使用 $elemMatch

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

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

      【讨论】:

      • 嗯,从 2.2 开始,您也可以使用相同的 $elemMatch 标准作为投影,然后您将在结果中获得匹配的元素。不过需要注意的是:当在投影中使用时,elemMatch 只会返回第一个匹配元素。不幸的是,无法返回多个匹配项。见:docs.mongodb.org/manual/reference/projection/elemMatch
      猜你喜欢
      • 2016-02-17
      • 2014-12-16
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2019-07-16
      • 2015-07-01
      • 2019-05-06
      相关资源
      最近更新 更多