You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过组织者ID查询所有预订?Mongoose查询求助

问题说明

我需要通过组织者ID查询所有对应的预订记录,但尝试的查询语句未生效,相关Mongoose Schema及无效查询代码如下:

Event Schema

const eventSchema = new mongoose.Schema(
  {
    title: { type: String, required: true },
    schedule: { type: Date, required: true },
    organizer: { type: mongoose.Schema.Types.ObjectId, ref: "user", required: true },
  },
  { timestamps: true }
);

Bookings Schema

const bookingSchema = new mongoose.Schema(
  {
    requester: { type: mongoose.Schema.Types.ObjectId, ref: "user", required: true },
    event: { type: mongoose.Schema.Types.ObjectId, ref: "event", required: true },
  },
  { timestamps: true }
);

无效查询语句

let bookings = await bookingModel.find({ "event.organizer": organizerId })

解决方案

原查询失效的原因是:booking集合中的event字段仅存储事件的ObjectId,并非嵌套文档,无法直接通过event.organizer跨集合查询。以下两种方法可以解决问题:

方法一:聚合查询(推荐)

利用$lookup关联event集合,再过滤组织者ID:

let bookings = await bookingModel.aggregate([
  // 关联event集合,将匹配的事件数据存入eventDetails字段
  {
    $lookup: {
      from: "events", // 需与MongoDB中event集合的实际名称一致(Mongoose默认将模型名转为复数小写)
      localField: "event",
      foreignField: "_id",
      as: "eventDetails"
    }
  },
  // 筛选出组织者ID匹配的记录
  {
    $match: {
      "eventDetails.organizer": mongoose.Types.ObjectId(organizerId) // 确保ID为ObjectId类型,字符串需转换
    }
  },
  // 可选:将eventDetails数组转为单个对象,方便后续使用
  {
    $unwind: "$eventDetails"
  }
]);

方法二:分步查询

先获取该组织者对应的所有事件ID,再查询关联这些事件的预订记录:

// 第一步:查询该组织者的所有事件ID
const eventIds = await eventModel.find({ organizer: organizerId }, "_id");
const targetIds = eventIds.map(item => item._id);

// 第二步:查询关联目标事件的预订记录
let bookings = await bookingModel.find({ event: { $in: targetIds } }).populate("event");

注意事项

  • 若organizerId是字符串类型,需用mongoose.Types.ObjectId()转换为ObjectId后再查询
  • 聚合查询的from字段必须对应MongoDB中的实际集合名称,注意复数形式
  • 分步查询适合数据量较小的场景,聚合查询效率更高,适合大数据量场景

内容的提问来源于stack exchange,提问作者Sanjay Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 05:16:36