2013-07-12 3 views
0

Если бы я имел коллекцию документов, как следующее:Монго выбрать все уникальные комбинации атрибутов документа

{a:'1', b:'2', c:'3', d:'a'}, 
{a:'1', b:'2', c:'1', d:'b'}, 
{a:'1', b:'2', c:'3', d:'c'}, 
{a:'1', b:'3', c:'1', d:'d'}, 
{a:'1', b:'2', c:'3', d:'e'}, 
{a:'2', b:'2', c:'1', d:'f'} 

Что будет наиболее эффективным запрос Монго, чтобы получить все уникальные комбинации признаков а, Ь, с? Является ли это возможным? Результат ищет что-то вроде:

{a:'1', b:'2', c:'3', d:*}, 
{a:'1', b:'2', c:'1', d:*}, 
{a:'1', b:'3', c:'1', d:*}, 
{a:'2', b:'2', c:'1', d:*} 

* = безразличное

Спасибо, ваша помощь оценена.

ответ

0

вы могли бы попробовать что-то вроде этого

db.<your collection>.aggregate([{$group:{"a": "$a", "b": "$b", "c": "$c"}}]) 

также попробуйте эту ссылку mongodb get distinct records

Я не MongoDB профессионал, но я думаю, вы также можете использовать JS функцию, например:

a = {} 
db.<your collection>.find().forEach(
    function(x) 
    { 
     if (a[[x.a, x.b, x.c]] == null) { 
      a[[x.a, x.b, x.c]] = true; 
      printjson(x); 
     } 
    } 
) 
0

Обычный инструмент для такого рода операций - это функция distinct. К сожалению, MongoDB distinct может фильтровать только одно поле (например, db.collection.distinct("a")). Возможны различные варианты работы, например, с использованием aggregate или group.

Пример с aggregate:

db.collection.aggregate({ 
    $group: { 
     _id: { 
      a: "$a", 
      b: "$b", 
      c: "$c" 
     } 
    } 
}) 

Вы должны извлечь информацию из результата, но я предполагаю, что это не большая проблема.

Пример с group:

db.collection.group({ 
    key: { 
     a: 1, 
     b: 1, 
     c: 1 
    }, 
    reduce: function (current, result) {}, 
    initial: {} 
}) 
Смежные вопросы