2013-08-27 2 views
1

У меня есть коллекция с схемой:MongoDB запроса - Выберите один из каждых из не уникального массива

{ 
    _id: 521cc63c19752c562300001a, 
    author: 'John', 
    quote: 'A quote', 
    type: 1, 
    stars: 
    [{ _id: 521cc63c19752c562300001b, 
     user: 521cc63c19752c5623000003, 
     date: Tue Aug 27 2013 16:31:08 GMT+0100 (IST) }] 
} 

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

db.quotes.aggregate([ 
    {$match: { 
     "type": { 
      $in: [1, 2, 3] //The unique types 
     } 
    }}, 

    // Group by the type 
    {$group: { 
     _id: "$type", 
     id: { $first: "$_id" }, 
     author: { $first: "$author" }, 
     stars: { $first: "$stars" }, 
     description: { $first: "$description" } 
    }}, 

    // Map/project the first result of each group 
    // to their respective keys 
    {$project: { 
     _id: "$id", 
     type: "$_id", 
     author: "$author", 
     description: "$description" 
     stars: "$stars" 
    }} 
]); 

Моя проблема заключается в том, что типы не могут быть всегда быть уникальным. Я мог бы найти три документа одного типа ([1, 1, 1]) или два одинаковых и один уникальный ([1, 2, 2]). Когда эта ситуация возникает, она возвращает только один или два результата из-за команды $ group by type. Любые советы, как я могу предоставить три уникальных типа и всегда получать три кавычки для каждого типа?

+0

Либо вы должны удалить '$ groupby' шага от вашего запроса, или я не понял вас правильно. – Shad

+0

@Shad Затем он возвращает все документы, которые имеют этот тип, а не только один из них. Я вижу, как я это подразумевал, я отредактирую свой вопрос. Благодарю. – AdrianCooney

ответ

0

Вы собираетесь должен должен написать свою собственную функцию, которая:

  • принимает ваши типов массива в качестве аргумента.
  • Создает пустые skipDocs хэш/объект, например.

    var objSkipDocs = {};

  • для каждого элемента вашего типов массив нулирует ключ этого значения в хэше.

    для (var i = 0; i < arrayTypes.length; i ++) { objSkipDocs [arrayTypes [i]] = 0; )

  • для каждого элемента вашего типов массив пытается получить документ, например.

    db.quotes.findOne ({'type': arrayTypes [i]}). Skip (objSkipDocs [arrayTypes [i]]);

    objSkipDocs [arrayTypes [i]] + = 1;

  • ли что-то с извлеченного документом

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