MongoDB聚合管道$match匹配异常+关联$lookup返回空值问题求助
MongoDB聚合管道$match匹配异常+关联$lookup返回空值问题求助
大家好,我现在遇到了MongoDB聚合管道的棘手问题:根据请求参数用$match过滤Book_issueed集合数据后,再通过$lookup关联users和books集合返回详情,但不管传入什么有效参数,最终聚合结果都是空数组。日志里能看到$match的条件正确生成,但就是匹配不到数据,想请大家帮忙排查一下问题所在。
我的实现代码与场景
我要做的是根据前端传入的查询条件(比如issuer_id、user_id等)过滤借阅记录,同时关联用户和书籍的详情信息。以下是我的核心代码:
聚合查询的API逻辑
export const bookIssuedFind = async (req: Request, res: Response) => { try { const searchTerm = req.body || {}; const filter:issued = {}; if (searchTerm.issuer_id) filter.issuer_id = searchTerm.issuer_id; if (searchTerm.user_id) filter.user_id = searchTerm.user_id; if (searchTerm.issue_date) filter.issue_date = searchTerm.issue_date; if (searchTerm.return_date) filter.return_date = searchTerm.return_date; if (searchTerm.book_status) filter.book_status = searchTerm.book_status; if (searchTerm.book_id) filter.book_id = searchTerm.book_id; const pipeline = []; if (Object.keys(filter).length > 0) { pipeline.push({ $match: filter }); } console.log(pipeline) pipeline.push( { $lookup: { from: "users", localField: "issuer_id", foreignField: "_id", as: "IssuerDetails" } }, { $lookup: { from: "users", localField: "user_id", foreignField: "_id", as: "UserDetails" } }, { $lookup: { from: "books", localField: "book_id", foreignField: "_id", as: "BookDetails" } } // { $unwind: { path: '$IssuerDetails', preserveNullAndEmptyArrays: true } }, // { $unwind: { path: '$UserDetails', preserveNullAndEmptyArrays: true } }, // { $unwind: { path: '$BookDetails', preserveNullAndEmptyArrays: true } }, ); console.log(pipeline) const issued = await Book_issueed.aggregate(pipeline).exec(); console.log(issued) const result = (Object.keys(filter).length > 0) ? (issued[0] || null) : issued; return res.status(200).json(result); } catch (error) { if (error instanceof Error) { res.status(500).json({ message: `${error.message}` }); } } }
关联集合的Schema定义
User集合Schema
import { Document, Model, model, Schema } from "mongoose"; interface IUser { name: string; mobileno: string; email: string; role: "Librarian" | "Local" | "Student"; password: string; repeat_password?: string | null; } interface IUserDocument extends IUser, Document {} const UserSchema = new Schema<IUserDocument>({ name: { type: String, required: true, trim: true, }, mobileno: { type: String, unique: true, required: true, match: /^[0-9]{10}$/, }, email: { type: String, unique: true, required: true, lowercase: true, match: /^[^\s@]+@[^\s@]+\.[^\s@]+$/, }, role: { type: String, enum: ['Librarian', 'Local', 'Student'], required: true }, password: { type: String, match: /[0-9a-zA-Z]*\d[0-9a-zA-Z]*/, required: true }, repeat_password: { type: String, ref: 'password' } }); export const User: Model<IUserDocument> = model<IUserDocument>("User", UserSchema);
Books集合Schema
import mongoose from "mongoose"; const { Schema } = mongoose export const books = new Schema({ book_name: { type: String, minLength: 3, maxLength: 30, required: true }, quantity: { type: Number, maxLength: 30, required: true }, description: { type: String, maxLength: 200 }, author: { type: String, minLength: 3, maxLength: 30, required: true }, category: { type: String, required: true }, shelf_name: { type: String, minLength: 3, maxLength: 30, required: true }, }); export const Books = mongoose.model('Books', books);
日志输出情况
当我传入issuer_id: '69a6810495126821c9e08281'时,控制台打印的管道和结果如下:
[ { '$match': { issuer_id: '69a6810495126821c9e08281' } } ] [ { '$match': { issuer_id: '69a6810495126821c9e08281' } }, { '$lookup': { from: 'users', localField: 'issuer_id', foreignField: '_id', as: 'IssuerDetails' } }, { '$lookup': { from: 'users', localField: 'user_id', foreignField: '_id', as: 'UserDetails' } }, { '$lookup': { from: 'books', localField: 'book_id', foreignField: '_id', as: 'BookDetails' } } ] []
可以看到聚合结果是空数组,说明$match阶段就没有匹配到数据,但我确认数据库里确实存在对应issuer_id的借阅记录,实在搞不懂哪里出错了,求各位大佬指点迷津!
备注:内容来源于stack exchange,提问作者harsh joshi
相关产品推荐
相关产品推荐

