"Преобразование в ObjectId не удалось для значения \" \ "по пути \" _ id \ "для модели \" ModelName \ "" - Mongoose - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь использовать агрегирование на основе моей модели mon goose. Пожалуйста, посмотрите на это и помогите мне с ошибкой и внесите любые предложения. Ошибка: "message": {"message": "Ошибка приведения к ObjectId для значения \" tour-stats \ "по пути \" _ id \ "для модели \ "Тур \" ",

Маршрут

router.get('/tour-stats', tour.getTourStats);

Контроллер

exports.getTourStats = async (req, res) => {
try {
const stats = await Tour.aggregate([
  {
    $match: { ratingsAverage: { $gte: 4.5 } }
  },
  {
    $group: {
      _id: null,
      numTours: { $sum: 1 },
      numRatings: { $sum: '$ratingsQuantity' },
      avgRating: { $avg: '$ratingsAverage' },
      avgPrice: { $avg: '$price' },
      minPrice: { $min: '$price' },
      maxPrice: { $max: '$price' }
    }
  },
  {
    $sort: { avgPrice: 1 }
  }
  // {
  //   $match: { _id: { $ne: 'EASY' } }
  // }
]);

res.status(200).json({
  status: 'success',
  data: {
    stats
  }
});
} catch (err) {
res.status(404).json({
  status: 'fail',
  message: err
});
}
};

Модель тура

const tourSchema = new mongoose.Schema(
{
name: {
  type: String,
  required: [true, 'A tour must have a name'],
  unique: true,
  trim: true,
},
duration: {
  type: Number,
  required: [true, 'A tour must have a duration'],
},
maxGroupSize: {
  type: Number,
  required: [true, 'A tour must  have a group size'],
},
difficulty: {
  type: String,
  required: [true, 'A tour must have a difficulty'],
},
ratingsAverage: {
  type: Number,
  default: 4.5,
},
ratingsQuantity: {
  type: Number,
  default: 0,
},
price: {
  type: Number,
  required: [true, 'A tour must have a price '],
},
priceDiscount: Number,
summary: {
  type: String,
  trim: true,
  required: [true, 'A tour must have a decription'],
},
description: {
  type: String,
  trim: true,
},
imageCover: {
  type: String,
  required: [true, 'A tour must have a cover image'],
},
images: [String],
createdAt: {
  type: Date,
  default: Date.now(),
},
 startDates: [Date],
 }
 // { timestamps: true }
);

Образец документа:

{"id": 8, "name": "Northern Lights", "duration": 3, "maxGroupSize": 12, "затруднение": "easy", "ratingAverage": 4.9, "ratingQuantity": 33, "price": 1497, "summary": "Наслаждайтесь северным сиянием в одном из лучших мест в мире", "description": "Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua, ut enim ad minim veniam Упражнения, требующиеся для выполнения заданий. "," imageCover ":" tour-9-cover.jpg "," images ": [" tour-9-1.jpg "," tour-9- 2.jpg "," tour-9-3.jpg "]," startDates ": [" 2021-12-16,10: 00 "," 2022-01-16,10: 00 "," 2022-12- 12,10: 00 "]}

Заранее спасибо.

1 Ответ

0 голосов
/ 15 апреля 2020

На групповом этапе Types.ObjectId(null) это недопустимо и впоследствии выдает ошибку. Вы не можете привести null к мону go ObjectId (Пн goose внутренне проверяет тип путем приведения).

Если вам не требуется группировка по полю. Просто используйте _id: null:

const stats = await Tour.aggregate([
  {
    $group: {
      _id: null,
      numTours: { $sum: 1 },
      numRatings: { $sum: "$ratingsQuantity" },
      avgRating: { $avg: "$ratingsAverage" },
      avgPrice: { $avg: "$price" },
      minPrice: { $min: "$price" },
      maxPrice: { $max: "$price" },
    },
  },
  {
    $match: { ratingsAverage: { $gte: 4.5 } },
  },
  {
    $sort: { avgPrice: 1 },
  },
  // {
  //   $match: { _id: { $ne: 'EASY' } }
  // }
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...