Агрегация mongoDB: сгруппировать все по логическому выражению

У меня есть коллекция с почтовыми индексами. Я хочу сгруппировать все записи из коллекции по первой букве названия города, будь то цифра или нет. Я хочу добиться чего-то вроде этого:

            {
                    "_id" : true,
                    "n" : 1234567
            },
            {
                    "_id" : false,
                    "n" : 87543
            }

До сих пор я пробовал:

db.zips.aggregate( [
    { $project : { _id : { $substr : ["$city",0,1] } } } ,
    {$group: {_id: {$in: ['0','1','2','3','4','5','6','7','8','9']}}}
] )

но монго выдает ошибку:

Fri Mar 14 23:01:52.566 aggregate failed: { "errmsg" : "exception: invalid operator '$in'", "code" : 15999, "ok" : 0 } at src/mongo/shell/collection.js:898

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


person ducin    schedule 14.03.2014    source источник


Ответы (1)


Гораздо проще, чем вы думаете:

db.zips.aggregate([
    { "$group": { 
        "_id": { "$lte": [ { $substr: ["$city", 0, 1] }, "9" ]},
        "n": { "$sum": 1 } 
    }}
])

Логический $lte Оператор выполняет лексическое сравнение содержимого, состоящего из одного символа (байта) и, конечно, "9" меньше "A".

Можете ли вы использовать $in в пути у вас есть? Нет, нельзя, отсюда и ошибка. Это оператор $match, поэтому может использоваться только на этом этапе конвейера для фильтрации результатов, а это не то, что вам нужно.

Итак, вам нужно «логическое» сравнение, а в лексическом контексте применяется разумный оператор. В любом случае вам нужно использовать «логический» оператор сравнения< /сильный>.

В форме этой конкретной проблемы выбранное "сравнение" является логичным выбором. Измените другие операторы, чтобы утверждать другое «логическое сравнение».

person Neil Lunn    schedule 15.03.2014
comment
хорошо, хорошо, но если я хочу проверить, что конкретное выражение является элементом набора/массива? Что мне делать тогда? Например. Я хочу проверить, что что-то равно 4, e или +? - person ducin; 15.03.2014
comment
@tkoomzaaskz правильный способ задать вопрос, отличный от вопроса, на который вы ответили, — это задать другой вопрос. Это относится к случаю, который вы представили. Не стесняйтесь публиковать еще один вопрос, если у вас есть другой сценарий, на который вы хотите получить ответ. - person Neil Lunn; 15.03.2014
comment
Основываясь на моем примере, вы можете видеть, что я пытаюсь использовать $in для получения логического выражения. На мой взгляд, выше нет точного ответа на мой вопрос. - person ducin; 15.03.2014