Функция агрегирования MongoDB - PullRequest
1 голос
/ 29 мая 2020

У меня есть следующая JSON Документы в пн go коллекция с именем «Фильмы»

{
      "_id": "5ed0c9700b9e8b0e2c542054",
      "movie_name": "Jake 123",
      "score": 20,
      "director": "Jake"
    },
    {
      "_id": "5ed0a9840b9e8b0e2c542053",
      "movie_name": "Avatar",
      "director": "James Cameroon",
      "score": 50,
      "boxoffice": [
        {
          "territory": "US",
          "gross": 2000
        },
        {
          "territory": "UK",
          "gross": 1000
        }
      ]
    },
    {
      "_id": "5ed0a9630b9e8b0e2c542052",
      "movie_name": "Titanic",
      "score": 100,
      "director": "James Cameroon",
      "boxoffice": [
        {
          "territory": "US",
          "gross": 1000
        },
        {
          "territory": "UK",
          "gross": 500
        }
      ],
      "actors": [
        "Kate Winselet",
        "Leonardo De Caprio",
        "Rajinikanth",
        "Kamalhaasan"
      ]
    }

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

db.movies.aggregate([
    {$match: {"boxoffice" : { $exists: true, $ne : []}}},
    {$project: {
                "title":"$movie_name", "max_boxoffice": {$max : "$boxoffice.gross"}, 
                "territory" : "$boxoffice.territory" } }
          ])

Я получаю следующий результат. Как мне получить правильную территорию, соответствующую коллекции?

{
    "_id" : ObjectId("5ed0a9630b9e8b0e2c542052"),
    "title" : "Titanic",
    "max_boxoffice" : 1000,
    "territory" : [
        "US",
        "UK"
    ]
},
{
    "_id" : ObjectId("5ed0a9840b9e8b0e2c542053"),
    "title" : "Avatar",
    "max_boxoffice" : 2000,
    "territory" : [
        "US",
        "UK"
    ]
}

Ожидаемый результат:

Аватар и Титани c собрали больше денег в США. Я хотел, чтобы на территориях отображалось их значение

{
        "_id" : ObjectId("5ed0a9630b9e8b0e2c542052"),
        "title" : "Titanic",
        "max_boxoffice" : 1000,
        "territory" : "US"
    },
    {
        "_id" : ObjectId("5ed0a9840b9e8b0e2c542053"),
        "title" : "Avatar",
        "max_boxoffice" : 2000,
        "territory" : "US"

    }

1 Ответ

0 голосов
/ 29 мая 2020

Для этого требования c можно использовать $set (aggregation). $set добавляет новые поля к существующим документам. и мы можем включить один или несколько этапов $set в операцию агрегирования, чтобы добиться этого, например:

db.movies.aggregate([
  {
    $match: { "boxoffice": { $exists: true, $ne: [] } }
  },
  {
    $set: {
      boxoffice: {
        $filter: {
          input: "$boxoffice",
          cond: { $eq: ["$$this.gross", { $max: "$boxoffice.gross" }]}
        }
      }
    }
  },
  {
    $set: {
      boxoffice: { $arrayElemAt: ["$boxoffice", 0] }
    }
  },
  {
    $project: {
      "title": "$movie_name",
      "max_boxoffice": "$boxoffice.gross",
      "territory": "$boxoffice.territory"
    }
  }
])

Пн go Площадка

...