Агрегация MongoDB | Фильтрация элементов массива - PullRequest
0 голосов
/ 29 мая 2020

У меня есть следующие JSON документы в Mon go Collection под названием «Movies».

{
  "_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"
  ]
}

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

1) Я пытаюсь выполнить следующий запрос, чтобы найти фильмы, собравшие более 800 кассовых сборов в Великобритании. Результаты идут хорошо. Но как мне удалить документы массива с US, которые к нему добавлены.

db.movies.aggregate([
    { $match: {"boxoffice.territory":"UK"} },
    { $project: {"title" : "$movie_name",
                 "director" : 1, 
                 "boxoffice" : { 
                    $filter: {
                         input: "$boxoffice",
                         as: "bo",
                         cond: { $gte: ["$$bo.gross" , 800]
                        }
                    }
                 } 
             }
    },
    { $match: {"boxoffice.territory":"UK"} }
])

Приведенный выше запрос возвращает следующий результат:

{
  "_id": "5ed0a9840b9e8b0e2c542053",
  "director": "James Cameroon",
  "title": "Avatar",
  "boxoffice": [
    {
      "territory": "US",
      "gross": 2000
    },
    {
      "territory": "UK",
      "gross": 1000
    }
  ]
}

Однако я хочу исключить документ «территория»: «США» из кассовых сборов. Мне не удалось заставить его работать.

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

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"
    ]
}
...