Найти подходящие элементы массива в документе MongoDB - PullRequest
1 голос
/ 15 марта 2012

Я занимаюсь разработкой веб-приложения с использованием Codeigniter и MongoDB.В базе данных я получил документ, который выглядит следующим образом:

{
    "_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, так и роли.

$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 ]

4 голосов
/ 09 февраля 2013

Это старый вопрос, но начиная с MongoDB 2.2 или около того, вы можете использовать позиционный оператор $ в проекции, чтобы в результат включался только соответствующий элемент массива.

Так что вы можете сделать что-то вроде этого:

$this->cimongo->where($where)->select(array('members.$'))->get('accounts');
2 голосов
/ 15 марта 2012

Это повторение этого вопроса:

Получить определенный элемент из массива mongoDB

Также вы можете использовать $ elemMatch

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

В этом и заключается проблема - вы не сможете получить совпадающие элементы массива, потому что mongo вернет весь документ, если эти элементы совпадают. Вам придется разобрать код на стороне клиента. Монго не может ответить: «вернуть только соответствующий массив».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...