2017-01-24 1 views
0

Я унаследовал проект, который содержит много данных на сервере MongoDB. Я пишу несколько запросов для него и сталкивался с довольно раздражающей проблемой. Мне нужно найти количество уникальных значений, которые мы будем называть ID. Проблема в том, что они могут появляться в двух разных точках в зависимости от происхождения этих данных.MongoDB: Получить отличное количество из двух разных таблиц

Например, таблица может выглядеть следующим образом:

{ 
    foo: { 
    ID: "ABC123" 
    }, 
    bar: { 
    ID: undefined 
    } 
} 

или

{ 
    foo: { 
    ID: undefined 
    }, 
    bar: { 
    ID: "ABC123" 
    } 
} 

или

{ 
    foo: { 
    ID: "ABC123" 
    }, 
    bar: { 
    ID: "ABC123" 
    } 
} 

К сожалению, я не могу повторно модель данных на этом точка. У меня довольно ограниченное знание MongoDB. Мне интересно, есть ли способ использовать агрегацию, чтобы объединить их вместе, поэтому я получаю набор всех идентификаторов в одном документе, чтобы они были уникальными. Достаточно тривиально группировать одно или другое, но группировка обоих даст мне дубликаты.

ответ

5

Вы можете использовать $project, затем $group, а затем $addToSet.

db.c.aggregate([ 
{ 
    $project : { 
     _id : 0, 
     IDS : ["$foo.ID", "$bar.ID"] 
    } 
}, 
{ 
    $unwind : "$IDS" 
}, 
{ 
    $group : { 
     _id : 1, 
     distinctIds : { 
      $addToSet : "$IDS" 
     } 
    } 
} 
]) 
2

Вы можете попробовать $group получить ID's в каждом bar и foo документ в массив и запустить их через $setUnion, чтобы получить отчетливый по ранее сгруппированных ID's.

db.collection.aggregate({ 
    $group: { 
     "_id": null, 
     "ID": { 
      $addToSet: { 
       "foo_id": "$foo.ID", 
       "bar_id": "$bar.ID" 
      } 
     } 
    } 
}, { 
    $project: { 
     "ID": { 
      $setUnion: ["$ID.foo_id", "$ID.bar_id"] 
     }, 
     _id: 0 
    } 
}) 
+0

Это также работает. Спасибо. – DeeV