Использование $ match в конвейере агрегации Moongose ​​в Mongodb для поля типа: mon goose .Schema.ObjectId - PullRequest
1 голос
/ 20 июня 2020

У меня есть модель, называемая назначениями, в которой есть поле с именем doctor, которое имеет тип : mon goose .Schema.ObjectId, . Я пытаюсь выполнить агрегацию модели, и на первом этапе я выполняю сопоставление $ в поле doctor, чтобы получить только документы, которые соответствуют предоставленному идентификатору врача. проблема в том, что я получаю пустой массив, когда запускаю запрос, но идентификатор врача, который я ищу, находится в базе данных. Ниже представлена ​​моя модель назначения. Теперь я не понимаю, почему я не могу получить результат, когда делаю запрос в поле больница и врач, но если я выполняю сопоставление в поле статуса, я получаю данные. Это потому, что поля Doctor и Hospital имеют тип type: mon goose .Schema.ObjectId . Пожалуйста, помогите

const appointmentSchema = new mongoose.Schema(
  {
    patient: {
      type: mongoose.Schema.ObjectId,
      ref: 'User',
      required: 'Patient user id must be provided'
    },
    hospital: {
      type: mongoose.Schema.ObjectId,
      ref: 'User',
      required: 'Hopital is reqired'
    },
    doctor: {
      type: mongoose.Schema.ObjectId,
      ref: 'User',
      required: 'Doctor is require'
    },
    status: {
      type: String,
      default: 'Active',
      trim: true,
      enum: {
        values: ['Active', 'Inactive'],
        message: 'Wrong Status Supplied'
      }
    },
    startDate: {
      type: Date,
      required: true
    },
    endDate: {
      type: Date
    },
    completed: {
      type: Boolean,
      default: false
    },
    message: String,
    createdAt: {
      type: Date,
      default: Date.now()
    }
  },
  {
    toJSON: { virtuals: true },
    toObject: { virtuals: true }
  }
);

и ниже мой агрегат ppipeline

exports.doctorSchedlue = catchAsync(async (req, res, next) => {


  const aggregateData = await Appointment.aggregate([
    { $match: { doctor: '5ee9be0147faee607cb3cea8' } }
  ]);

  res.status(200).json({
    status: 'success',
    id: req.params.id,
    aggregateData
  });
});

1 Ответ

0 голосов
/ 20 июня 2020

Я нашел решение

exports.doctorSchedlue = catchAsync(async (req, res, next) => {
  const doctAppointments = await Appointment.find({ doctor: req.params.id });

  const aggregateData = await Appointment.aggregate([
    {
      $match: { doctor: new ObjectId('5ee9be0147faee607cb3cea8') }
    }
  ]);

  res.status(200).json({
    status: 'success',
    id: req.params.id,
    aggregateData,
    doctAppointments
  });
});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...