2015-11-27 4 views
1

У меня есть коллекция и документы составлены в следующем формате:MongoDB группа несколько ключей, чтобы получить уникальные документы в коллекции

[ 
{ 

    "brand" : "Toshiba", 
    "title" : "Toshiba Pors 7220CT/NW2", 
    "category" : "notebooks", 
    "code" : "ABCDTESTASD12", 
    "pid" : "45790" 
}, 
{ 
    "brand" : "Toshiba", 
    "title" : "Toshiba Satellite Pro 4600 PIII800", 
    "category" : "notebooks", 
    "ean" : "PATDSRESSSN12", 
    "pid" : "12345" 
} 
] 

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

+0

это единственный документ? можете ли вы показать ожидаемый результат? – styvane

ответ

0

Поскольку этапы агрегации трубопроводов имеют maximum memory use limit, используйте следующий трубопровод, который имеет дело с большими наборами данных, установив allowDiskUse возможности верно, таким образом, позволяет писать данные во временные файлы. В трубопроводе, используйте $match сцену, чтобы отфильтровать простофили, так что вы остаетесь только с уникальными документами, которые вы можете запрашивать по _id:

var pipeline = [ 
    { 
     "$group": { /* Group by fields to match on brand, title, category and code */ 
      "_id": { 
       "brand": "$brand", 
       "title": "$title", 
       "category": "$category", 
       "code": "$code" 
      }, 
      "count": { "$sum": 1 }, /* Count number of matching docs for the group */ 
      "docs": { "$push": "$_id" }, /* Save the _id for matching docs */ 
      "pids": { "$push": "$pid" } /* Save the matching pids to list */ 
     } 
    }, 
    { "$match": { "count": 1 } }, /* filter out dupes */ 
    { "$out": "result" } /* Output aggregation results to another collection */ 
], 
options = { "allowDiskUse": true, cursor: {} }; 

db.products.aggregate(pipeline, options); // Run the aggregation operation 

db.result.find(); // Get the unique documents 
+0

chridam не возвращает никаких результатов. –

+0

извините Chridam, это моя ошибка. Он работает нормально. Спасибо. –

+0

нужна небольшая помощь. Могу ли я получить список pids для каждого результата doc? –

1

можно использовать оператор группы из структуры агрегации:

db.computers.aggregate(
    [ 
     { 
      $group : { 
       _id : { brand: "$brand", title: "$title", category: "$category", code: "$code" }, 
       count: { $sum: 1 } 
      } 
     } 
    ] 
) 
+0

Спасибо AleFranz за ваш запрос. У меня есть 5 миллионов документов, и он возвращает ошибку, например: «exception: превышен предел памяти для $ group, но не разрешает внешний вид. Pass allowDiskUse: true для выбора». –

+0

Вы можете исправить это, добавив второй параметр для aggregate(): {allowDiskUse: true, cursor: {}} – AleFranz

+0

Добавлено, но возвращает ту же самую проблему –

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