mongodb “对于模型\“ModelName\"的路径\"_id\”处的值\"\”,强制转换为ObjectId失败"-Mongoose

mgdq6dx1  于 2023-02-15  发布在  Go
关注(0)|答案(3)|浏览(152)

我正在尝试使用基于我的 Mongoose 模型的聚合。请查看这个并帮助我解决错误,并给出任何建议。错误:"消息":{"消息":"对于模型"游览",路径"_id"处的值"游览统计",转换为ObjectId失败,
途径

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 }
);

示例文档:
{"身份证":8,"姓名":《北极光》,《持续时间》:3,"最大组大小":12、"难度":"容易"、"评分平均":4.9,"额定值数量":33、"价格":1497,"概要":"在世界上最好的地方之一欣赏北极光","描述":"Sed do eiusmod tempor incidunt ut labore et dolore magna aliqua,ut enim ad minim veniam,让我们的锻炼ullamco laboris nisi ut aliquip ex ea commodo conquat.","图像封面":"旅游-9-封面. jpg","图片":["游览-9-1.jpg"、"游览-9-2.jpg"、"游览-9-3.jpg"]、"开始日期":【"2021年12月16日10时""2022年1月16日10时""2022年12月12日10时"】}
先谢了。

h9a6wy2h

h9a6wy2h1#

我也上过这门课,一直在努力理解到底是怎么回事,最后终于找到了,在我的情况下,之所以会这样,是因为路线顺序错了。
当你试图发送请求到“API/v1/图尔斯/tour-stats”时,你实际上是在发送请求到“api/v1/tours/:id”,而“tour-stats”作为id到达这个路由(显然是无效的),这会导致一个错误。所以请确保你的“tour-stats”路由定义在你的id路由之前。

9q78igpj

9q78igpj2#

在您的路线文件中把统计路线以上所有下面的例子在我的情况下

//GET USER STATS

router.get("/stats", async (req, res) => {});

//UPDATE
router.put("/:id", async (req, res) => {});

//DELETE
router.delete("/:id", async (req, res) => {});

// GET USER
router.get("/:id",  async (req, res) => {});

//GET ALL USERS
router.get("/", async (req, res) => {});
8dtrkrch

8dtrkrch3#

我也有同样的问题。您需要将带有聚合的路由放在带有“../:id”的路由之前

相关问题