2015-10-05 1 views
1

Скажем для каждого документа коллекции, он имеет строковый массив. как я могу считать повторяющееся время каждого элемента массива во всей этой коллекции? Прямо сейчас я могу найти весь отдельный элемент, но затем функция Map Reduce немного сложна, что я не полностью понял.MongoDB: подсчитывает повторяющееся время элемента массива с помощью MapReduce

Doc A  
{ 
_id: 
name: 
actors: ["a", "b", "c"] 
} 

Doc B  
{ 
_id: 
name: 
actors: ["a", "d"] 
} 

Doc C 
{ 
_id: 
name: 
actors: ["a", "c", "f"] 
} 

Я WANNE получить статистический результат с: 3 B: 1 C: 2 D: 1 F: 1.

ответ

1

Альтернативный маршрут, который вы могли бы взять, это aggregation framework. Учитывая вышеизложенную коллекцию в качестве примера

коллекция теста Заселите:

db.collection.insert([ 
    { "_id" : 1, "name" : "ABC1", "actors": ["a", "b", "c"] }, 
    { "_id" : 2, "name" : "ABC2", "actors" : ["a", "d"] }, 
    { "_id" : 3, "name" : "XYZ1", "actors" : ["a", "c", "f"] } 
]) 

Следующая операция агрегации трубопроводов использует $unwind этапа для вывода документа для каждого элемента в actors массиве и $group этап для группировки документов по значению в массиве actors, тогда подсчитывает количество документов на каждую группу (что дает появление элемента массива NTS как группа) по пути $sum оператора:

db.collection.aggregate([ 
    { "$unwind" : "$actors" }, 
    { "$group": { "_id": "$actors", "count": { "$sum": 1} } } 
]) 

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

/* 0 */ 
{ 
    "result" : [ 
     { 
      "_id" : "f", 
      "count" : 1 
     }, 
     { 
      "_id" : "d", 
      "count" : 1 
     }, 
     { 
      "_id" : "c", 
      "count" : 2 
     }, 
     { 
      "_id" : "b", 
      "count" : 1 
     }, 
     { 
      "_id" : "a", 
      "count" : 3 
     } 
    ], 
    "ok" : 1 
} 
+1

спасибо, это уже достаточно близко к тому, чего я жду. Я посмотрю на это и попробую более полный пример. –