2016-02-17 2 views
3

У меня есть массив, содержащий объекты со значениями, например:MongoDB процентов значений несовпадающих в массиве

[{ 
    item: '123A', 
    meta: {} 
}, 
{ 
    item: '123A', 
    meta: {} 
}, 
{ 
    item: '123B', 
    meta: {} 
} 
,{ 
    item: '123A', 
    meta: {} 
}] 

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

Например, в этом случае наивысший соответствующий элемент равен 123A, поэтому я хотел бы вернуть процент этого элемента, как он найден в массиве, который будет 0.75.

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

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

Любые предложения были бы замечательными.

+0

Хм. Как насчет добавления взвешенного индекса в 'item', затем с помощью текстового поиска и сортировки по весу? – Brandon

ответ

6

Возможно с агрегацией, но вам нужно включить оператор $unwind перед этапом $group нормализовать/расплющить ваш массив, так что вы можете выполнять необходимые агрегирование с помощью оператора в $group.

Рассмотрим следующую операцию агрегации, которая даст вам расчет проценты в конечном итоге, это предполагает, ваши документы имеют голую минимальный пример схемы:

{ 
    _id: 1, 
    arr: [ 
     { item: '123A', meta: {} }, 
     { item: '123A', meta: {} }, 
     { item: '123B', meta: {} }, 
     { item: '123A', meta: {} } 
    ] 
} 

Запуск трубопровода

var pipeline = [ 
     { 
      "$project": { 
       "arr": 1, 
       "arrSize": { "$size": "$arr" } 
      } 
     }, 
     { "$unwind": "$arr" },  
     { 
      "$group": { 
       "_id": "$arr.item", 
       "count": { "$sum": 1 }, 
       "total": { "$first": "$arrSize" } 
      } 
     }, 
     { 
      "$project": { 
       "item": "$_id", 
       "_id": 0, 
       "percentage":{ 
        "$multiply": [ 
         { "$divide": [ 100, "$total" ] }, "$count" 
        ] 
       } 
      } 
     } 
    ]; 
db.test.aggregate(pipeline); 

Образец Выход

{ "item" : "123A", "percentage" : 75 } 
{ "item" : "123B", "percentage" : 25 } 
+1

@chiram вы лучше всего в агрегировании mongodb, могу я получить вашу электронную почту, пожалуйста :) Или, по крайней мере, вы могли бы объяснить все эти операторы $ –

+1

Удивительно, спасибо! – dzm

+1

Я читаю различные ваши ответы, чтобы учиться лучше :) – shubhendu

Смежные вопросы