Агрегация MongoDB $match и $project

У меня есть очень простой набор документов.

> db.ysTest.aggregate({$project:{_id:1,unitStatus:1}});
{
"result" : [
    {
        "_id" : ObjectId("514309f3e18aa7d14100217a"),
        "unitStatus" : "es_pws"
    },
    {
        "_id" : ObjectId("514309f3e18aa7d141002816"),
        "unitStatus" : "es_run"
    },
    {
        "_id" : ObjectId("514309f0e18aa7d14100021e")
    }
],
"ok" : 1
}

При использовании «агрегата» с использованием $match и $project я ожидаю 1 документ, но получаю их все. примечание: я использую агрегат, потому что он будет частью более сложного сопоставления, но я старался сделать его простым для этого примера.

> db.ysTest.aggregate({
... $match: {
...   unitStatus: {$exists: true, $nin: ["es_pws", "es_stl"]}
... },
... $project: {_id: 1,unitStatus:1}
... });
{
"result" : [
    {
        "_id" : ObjectId("514309f3e18aa7d14100217a"),
        "unitStatus" : "es_pws"
    },
    {
        "_id" : ObjectId("514309f3e18aa7d141002816"),
        "unitStatus" : "es_run"
    },
    {
        "_id" : ObjectId("514309f0e18aa7d14100021e")
    }
],
"ok" : 1
}

Что я делаю не так ?


person Kurt Agius    schedule 20.03.2013    source источник
comment
вы собираетесь группироваться? Вам нужен этап {$group}, чтобы указать, как вы хотите сгруппировать документы и какую агрегацию вы хотите.   -  person Asya Kamsky    schedule 21.03.2013
comment
Это тонкая ошибка, закройте $match другим } перед запятой и добавьте { перед $project, и он будет работать так, как вы хотите: db.ysTest.aggregate( {$match: {unitStatus: {$exists :true, $nin: [es_pws, es_stl]}} }, {$project:{_id: 1,unitStatus:1}} );   -  person grund    schedule 21.03.2013
comment
Вы пробовали только unitStatus: {$exists: true}, чтобы убедиться   -  person sambomartin    schedule 21.03.2013
comment
это правда, что ваш синтаксис неверен (скобки неуместны), но если вы исправите это, у меня все будет хорошо. Однако ваш синтаксис выдаст ошибку. обратите внимание, что у вас нет '{' перед $project - это делает его полем, а не оператором агрегации, и дает синтаксическую ошибку.   -  person Asya Kamsky    schedule 21.03.2013
comment
Да, это правда... мой синтаксис был совершенно неправильным. Я работал с драйвером mongodb + nodejs, и там все немного иначе, чем в оболочке. В любом случае, это решило мою проблему, спасибо!   -  person Kurt Agius    schedule 21.03.2013


Ответы (1)


Глядя на ваш документ, запрос и комментарии, становится ясно, что вы не используете оператор $group, а $match — это просто предложение выбора, которое фильтрует результат на основе заданных вами критериев. в твоем случае

... $match: {
...   unitStatus: {$exists: true, $nin: ["es_pws", "es_stl"]}
... }

Но $match и $group не гарантируют, что он вернет один документ. какая гарантия ваша схема, критерии запроса.

person rummykhan    schedule 09.05.2016