Группируйте и получайте средние значения для массивов в документах - PullRequest
1 голос
/ 25 марта 2020

Я новичок в Пн go, поэтому, если это базовый c вопрос, я прошу прощения.

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

Пример структуры документа:

_id: ObjectID("ABC123")
StoreItems: Array
    0: Object
        Type: "Apple"
        Color: "Green"
        Size: "Small"
        Weight: "5"
    1: Object
        Type: "Orange"
        Color: "Orange"
        Size: "Small"
        Weight: "8"
    2: Object
        Type: "Grapes"
        Color: "Green"
        Size: "Small"
        Weight: "8"

Я хочу запрос, который может сгруппировать все типы, равные яблокам, и получить средний вес. Я привык делать это с SQL, но эта логика c, похоже, здесь не применима. Это то, что я получил до сих пор и на данный момент застрял:

$unwind: {
  path: "$StoreItems"
},
{
  $group: {
    "_id": "$StoreItems.Type",
    "count": {
      $avg: "$StoreItems.Weight"
    }
  }

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

1 Ответ

0 голосов
/ 25 марта 2020

Вы почти у цели. Если вы хотите отфильтровать коллекцию по критериям, вам нужно использовать $ match :

[
  {
    $unwind: {
      path: "$StoreItems"
    }
  },
  { $match: { "StoreItems.Type": "Apple" } }, /** group will have docs only where type == Apple */
  {
    $group: {
      _id: "$StoreItems.Type",
      count: {
        $avg: "$StoreItems.Weight"
      }
    }
  }
]
...