2017-01-24 3 views
0

У меня есть коллекция поисков mongo. Каждый поиск имеет объект критериев, который может иметь любую комбинацию критериев. Так что-то вроде:Подсчет уникальных ключей - конвейер агрегации mongo

{ 
    "_id": 1, 
    "criteria": { 
     "state": ["NY", "IL"] 
     ... 
    }, 
    ... 
} 

Я строй агрегации Монго трубопровода, и мне интересно, как проецировать только ключи, чтобы я мог их сосчитать.

До сих пор первый шаг моего трубопровода:

db.userSearch.aggregate([ 
    { "$project": { "criteria":1 } }, 
    ... 
]) 

Это возвращает все критерии объектов правильно, теперь мне нужно проецировать ключи каким-то образом. У кого-нибудь есть идеи?

Edit: желаемый результат: {"state":20, "balance":5, "geolocation":10, ...}

+0

Вы можете использовать $ размотать https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/ – Euclides

+0

Объект критериев не является массивом, хотя, и ни один не это суб объекты –

+0

Может вам добавить ожидаемый результат в сообщение? – Veeram

ответ

1

В случае, если кто задавался вопросом, я использовал MapReduce следующим образом.

map = function() { 
    Object.keys(this.criteria).forEach(function(k) { 
     emit(k, 1) 
    }) 
} 

reduce = function(k, vals) { 
    return Array.sum(vals) 
} 

db.userSearch.mapReduce(map, reduce, 'out')