Почему две коллекции с $ out никогда не заканчиваются? MongoDB - PullRequest
2 голосов
/ 01 мая 2020

ОК, у меня есть две коллекции. Один из них имеет 6 миллионов документов, другой имеет 25 миллионов документов. Я хочу их в новой коллекции:

Пример коллекции 1:

Mov ie

 {"movieId" : "1", "name" : "Titanic"},
 {"movieId" : "2", "name" : "King Kong"}

Пример коллекции 2:

Персонаж

{"characterId": "1", "movieId": "1", "characterName": "Name 1"},
{"characterId": "2", "movieId": "1", "characterName": "Name 2"},
{"characterId": "3", "movieId": "1", "characterName": "Name 3"}

Итак, я хочу новую коллекцию, такую ​​как:

{
  "movieId" : "1", 
  "name" : "Titanic", 
  "characters":[ *collection 2 here* ]
},
{
  "movieId" : "2", 
  "name" : "King Kong", 
  "characters":[]
}

Я пытался:

db.Movie.aggregate([{ $lookup: { from: "Character",localField: "movieId", foreignField: "movieId", as: "characters" }},{ $out : "movie_characters" }])

Но это никогда не заканчивается :( (никогда я не имел в виду, как 10 часов позже он все еще думал) Если я выполню это без $ out, то результаты будут показаны через 10 минут.

Я что-то не так делаю с $ out?

Спасибо за любой совет.

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

Главное, что вы оставляете здесь, это индекс.

$lookup при сопоставлении с внешним полем, MongoDB использует индекс.

Итак, создайте индекс в коллекции символов с помощью:

db.Character.createIndex({ "movieId": 1 })

А затем применить агрегацию поиска

db.Movie.aggregate([
  {
    $lookup: {
      from: "Character",
      localField: "movieId", 
      foreignField: "movieId", 
      as: "characters" 
    }
  },
  { 
    $out : "movie_characters" 
  }
])

Надеюсь, это поможет:)

1 голос
/ 01 мая 2020

Проблема не только в одном index, но и в производительности. Я настоятельно рекомендую вам использовать Курсоры для сложных запросов, подобных вашему. ( Проверьте этот ответ для получения дополнительной информации )

Когда вы используете этот запрос, вы также «заполняете» свою ОЗУ всеми документами. Так что использование курсора определенно поможет вам.

Кроме того, попробуйте использовать Пн go Компас для тестирования ваших запросов перед запуском его в производство в режиме Explain, который дает вам все, что вам нужно знать, особенно как долго ваш выполнение запроса, какие индексы он использует и многое другое.

...