Как работают пайплайны фреймворка агрегации mongodb?

У меня может быть фундаментальное непонимание того, как работают пайплайны фреймворка агрегации mongodb. Я ожидаю, что каждый шаг потребляет результат предыдущего шага. Вот конкретный пример использования коллекции образцов, представленной по адресу http://media.mongodb.org/zips.json< /а> :

> db.zipcodes.aggregate({$match:{state:"CA"}});

дает такие результаты.

    {
        "city" : "TRUCKEE",
        "loc" : [
            -120.295031,
            39.319321
        ],
        "pop" : 199,
        "state" : "CA",
        "_id" : "96162"
    }

Все идет нормально. Затем я решил добавить еще один шаг, чтобы получить проекцию вышеизложенного, запустив:

> db.zipcodes.aggregate({
    $match:{state:"CA"}, 
    $project: {city: 1, pop: 1, state: 1}
});

Проекция работает, но игнорирует первый шаг $match. Он основан на исходном вводе и включает документы, в которых состояние != CA:

    {
        "city" : "THAYNE",
        "pop" : 505,
        "state" : "WY",
        "_id" : "83127"
    }

Мои ожидания неверны или я смотрю на синтаксическую проблему, не замечая ее? Я использую версию 2.2.0:

> db.version();
2.2.0

Примеры запросов, кажется, работают.

Заранее спасибо.


person jbelis    schedule 29.10.2012    source источник


Ответы (1)


Это проблема синтаксиса, вы делаете:

db.zips.aggregate({$match:{state:"CA"}, $project: {city: 1, pop: 1, state: 1}})

... с обоими полями, $match и $project, в одном документе. Агрегатная команда принимает ряд отдельных документов, описывающих этапы конвейера:

db.zips.aggregate({$match:{state:"CA"}}, {$project: {city: 1, pop: 1, state: 1}})

По-видимому, если вы поместите несколько полей в этап конвейера, MongoDB будет использовать только последнее. Эта ошибка была исправлена ​​в следующей ветке разработки: https://jira.mongodb.org/browse/SERVER-6861

person A. Jesse Jiryu Davis    schedule 29.10.2012