Мангуст извлекает данные из коллекции A, если его ссылка существует в коллекции B

#node.js #mongodb #express #mongoose

#node.js #mongodb #выразить #мангуст

Вопрос:

Мне нужна ваша помощь, пожалуйста, с запросом mongoose для моего экспресс-приложения.

У меня есть 3 коллекции фильмов, телешоу и трейлеров, и мне нужно получить все фильмы или шоу, в которых есть трейлеры. вот модели:

 var TrailerSchema = new Schema(
  {
    link: {
      type: String,
      required: true,
    },
    movieId: { type: mongoose.Schema.Types.ObjectId, ref: 'Movie' },
    showId: { type: mongoose.Schema.Types.ObjectId, ref: 'Show' },
  }
)
module.exports = mongoose.model('Trailer', trailerSchema)
 
 const mongoose = require('mongoose')
const Schema = mongoose.Schema

var movieSchema = new Schema(
  {
    title: {
      type: String,
      required: true,
    },
    rating: {
      type: Number,
    },
  }
)
module.exports = mongoose.model('Movie', movieSchema)
 

в коллекции трейлеров есть несколько документов с полем MovieID, а некоторые с showId.
Теперь, как я могу получить все фильмы или шоу, у которых есть трейлеры?

Ответ №1:

поскольку вы только что сохранили movieId TrailerSchema и movieSchema не имеете поля like TrailerId:[{type: mongoose.Schema.Types.ObjectId, ref: 'Trailer'}] , вы не можете использовать populate … но сначала для вашей проблемы

 let listOfIds = await Link.find( { movieId: { $exists: true } }, 'movieId._id' ).lean() 
 

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

  let listOfMovies = await Movie.find({ _id: { $in: listOfIds.map((id) => {if(id.movieId) return id.movieId._id}  ) }, })
 

Комментарии:

1. Спасибо за помощь, Мохаммед, я немного изменил ваше решение, и теперь я получаю listOfIds, но listOfMovies — это пустой массив. вот настройки: пусть listOfIds = await Link.find( { MovieID: { $exists: true } }, ‘_id’ ).exec() пусть listOfMovies = await Movie.find({ _id: { $in: listOfIds.map((id) => id._id)}, })

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

3. Спасибо, что показали мне, не могли бы вы помочь мне с запросом listOfMovies Я получаю пустой массив, и ошибки нет, я искал решение, но я до сих пор понятия не имею.

4. можете ли вы получить listOfIds? или является пустым массивом

5. Я получаю список идентификаторов да