如何通过组织者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
相关产品推荐
相关产品推荐

