2014-02-05 1 views
0

Учитывая коллекцию MongoDB, как это:Монго дб группировки + отчетливый

c = [{ 
    "name": "john", 
    "tags": ["a", "b", "c"], 
    "values": [1, 2, 3] 
    }, 
    { 
    "name": "paul", 
    "tags": ["a", "d"], 
    "values": [3, 4, 5] 
    } 
] 

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

"все документы, чьи метки включает в себя значение a"

я получаю:

[ 
    { 
    "name": "john" 
    }, 
    { 
    "name": "paul" 
    }, 
    "aggregated_tags": ["a", "b", "c", "d"], 
    "aggregated_values": [1, 2, 3, 4, 5] 
] 

Я уже пришел к решению, но я не доволен этим, поскольку он включает обработку списков в Python, чтобы я отфильтровывал все дублированные термины, которые я получил в «доступных_tags» и «доступных_значениях», m ищет команду агрегации, которая выполняет задание.

Я знаю, что я должен использовать какую-то агрегирование манго, но хотя я могу сделать запрос с правильными критериями, я все еще не могу понять, как агрегировать/отличать поля критериев, которые получаю как результаты ,

+1

Посмотрите на оператора $ размотки. Это выравнивает массивы, как я думаю, вы хотите: http://docs.mongodb.org/manual/reference/operator/aggregation/unwind/ – Alex

+0

Спасибо. Я думаю, что я понял, как это сделать, используя '$ unwind', но я все еще не уверен, что лучший способ. Я собираюсь обновить ответ завтра. –

ответ

1

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

После разматывания в агрегации вы можете использовать $addToSet, чтобы получить отличные значения. Пример следует только с тегами для краткости, но только, чтобы получить суть:

db.tags.aggregate([ 
    {$project: { _id: 0, tags: 1 }}, 
    {$unwind: "$tags" }, 
    {$sort: { tags: -1 } }, 
    {$group:{ _id: null, tags: {$addToSet: "$tags"} }}, 
}]) 

Сортировка не является обязательной для поддержания порядка, если это важно.

Конечно, вам нужен традиционный запрос для возврата содержимого документа для сопоставления элементов, но отдельный запрос агрегирования может дать вам комбинированные теги и значения из этого набора документов, который, как представляется, является тем, что вы после.

Это особенно полезно, если соответствующие документы - это большой результат, и вы просто хотите отобразить только 20 из совпадений, но все же хотите, чтобы комбинированные теги были из всех соответствующих документов.

На этой ноте, если то, за чем вы находитесь, является чем-то вроде результата faceted search, тогда может быть какое-то чтение, которое вы сочтете полезным для своей цели.

http://blog.mongodb.org/post/59757486344/faceted-search-with-mongodb