Подтвердить что ты не робот

Группа MongoDB по внутренним элементам массива

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

_id: {
$oid: "52b632a9e4f2ba13c82ccd23"
},
providerName: "The Guardian",
url: "http://feeds.theguardian.com/c/34708/f/663860/s/3516cebc/sc/38/l/0L0Stheguardian0N0Cmusic0C20A130Cdec0C220Cwaterboys0Efishermans0Eblues0Etour0Ehammersmith/story01.htm",
subject: "The Waterboys – review",
class_artist: [
"paul mccartney"
]

Я пытался (безуспешно) получить список всех отдельных исполнителей (class_artist) в зависимости от количества статей, в которые они были помечены за последние 7 дней.

Я дошел до:

var date = new Date();
date.setDate(date.getDate() - 7);
db.articles.group({
               key: { class_artist: 1 },
               cond: { class_date: { $gt: date } },
               reduce: function ( curr, result ) { result.cnt++; },
               initial: { cnt : 0 }
            }).sort({cnt: -1});

Но, к сожалению, они не учитывают их на основе отдельных значений массива, а составами массивов (т.е. списками художников).

Я попытался использовать функцию $unwind, но не смог заставить ее работать.

4b9b3361

Ответ 1

Какие рамки вы используете? Это не оболочка MongoDB и выглядит как какая-то странная оболочка вокруг MapReduce. В этом случае $unwind будет недоступен, и вам понадобится его для пользователя в структуре агрегации. Вот что вы хотите в оболочке mongo:

db.articles.aggregate([
  {$match: { class_date: { $gte: date } } },
  {$project: { _id: 0, class_artist: 1 } },
  {$unwind: "$class_artist" },
  {$group: { _id: "$class_artist", tags: { $sum: 1 } }},
  {$project: { _id: 0,class_artist: "$_id", tags: 1 } },
  {$sort: { tags: -1 } }
])

Так эффективно:

  • Фильтровать по дате, потому что вы уже установили var за последние 7 дней.
  • Project только поля, которые нам нужны {Нам нужен только один! }
  • Unwind массив, поэтому теперь у нас есть запись для каждого элемента массива в каждом документе
  • Group для художника из расширенных документов
  • Проект в формате документа, который вы можете использовать в качестве группы, запутанной с помощью _id
  • Sort результаты в обратном порядке, чтобы увидеть верхний отмеченный первый

И великая вещь об агрегировании - вы можете постепенно наращивать эти этапы, чтобы увидеть, что происходит.

Встряхните и запекайте в своей собственной имплантации или в инфраструктуре ODM по мере необходимости.