MongoDB 搜索过滤器中的逻辑问题 |节点JS

问题描述 投票:0回答:0

我正在开发出租车预订 api。我面临的问题是一个 getAllBookings api,管理员将使用它从预订数据库中获取所有预订的历史记录。说到数据库,我将稍微分享一下我的预订模型和用户模型的数据库模型。我面临的问题是,当我使用参数中的 userId 或 driverId 进行搜索查询时,我会正确获得响应以及具有该特定 ID 的所有详细信息。但是,当我尝试在参数中为该 userId 的同一用户发送名称查询或电子邮件查询时,它会返回一个空的预订数组。 以下是我的预订模型:

const mongoose = require('mongoose');

const bookingSchema = new mongoose.Schema({

    user: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User',
        required: true
    },

    driver: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User',
        required: true
    },

    pickupLocation: {
        address: {
            type: String,
            required: true
        },

        latitude: {
            type: Number 
        },

        longitude: {
            type: Number  
        },
    },

    dropoffLocation: {
        address: {
            type: String,
            required: true,
        },

        latitude: {
            type: Number,    
        },

        longitude: {
            type: Number,    
        },
    },


    fare: {
        type: Number,
        required: true,
    },

    bookingStatus: {
        type: String,
        required: true,
        default: 'Available',
    }
},
{
    timestamps: true
});

module.exports = mongoose.model("Booking", bookingSchema);

用户模型:

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({

    name: {
        type: String,
        required: [true, "Please add your Name"],
        trim: true
    },
    email: {
        type: String,
        required: [true, "Please add the user email address"],
        unique: [true,"Email address already taken"],
        trim: true
    },

    password: {
        type: String,
        required: [true, "Please add the password"],
        trim: true,
    },

    phoneNumber: {
        type: String,
        required: [true, "Please add Phone Number"],
        trim: true
    },

    role: {
        type: String,
        required: true,
        default: 'user',
        enum: ['admin', 'user', 'driver'],
    },

    licenseNumber: {
        type: String,
        trim: true
    },

    carModel: {
        type: String,
        trim: true
    },

    carNumber: {
        type: String,
        trim: true
    },

    isDeleted: {
        type: Boolean,
        default: false
    },

    isAvailable: {
        type: Boolean,
        default: false
    },

    location: {
        type: {
            type: String,
            enum: ['Point']
        },
        coordinates: {
            type: [Number] //lat and long
        }
    },

},
{
    timestamps: true
});

// Index the location field for geospatial queries
userSchema.index({ location: '2dsphere' });

module.exports = mongoose.model("User", userSchema);

这里是控制器功能供您参考:

const getAllBookings = async(req, res) => {
    logger.info('Inside getAllBookings');
    try{
        const { 
            page = 1, 
            limit = 10,
            name, 
            email, 
            role, 
            userId, 
            driverId,
        } = req.query;

        let filter = {};

        if (name) {
            filter['user.name'] = { $regex: name, $options: 'i' };
        }

        if (email) {
            filter['user.email'] = { $regex: email, $options: 'i' };
        }

        if(role){
            filter['user.role'] = role;
        }

        if(userId){
            filter.user = userId;
        }

        if(driverId){
            filter.driver = driverId;
        }

        const skip = (page - 1) * limit;

        console.log(filter);


        const bookings = await Booking.find(filter)
            .populate('user driver')
            .skip(skip)
            .limit(limit)
            .sort({createdAt: -1})
            .lean()
            .exec();

            console.log("bookings", bookings);

            const count = await Booking.countDocuments(filter);
            const totalPages = Math.ceil(count / limit);

        res.status(200).json({bookings, totalPages, currentPage: +page});
    } catch(error){

        logger.error(`Error in getAllBookings: ${error.message}`);
        res.status(500).json({
            message: 'Server Error',
        });
    }
};

这是an id is sent in query params | 时的邮递员回复 这是the name of the user with the above id is sent in query params | 时的邮递员回复 如您所见,它仅在传递 id 时给出结果。请协助我调试它,因为我希望它在发送姓名或电子邮件时也能正常工作。

我试图通过安慰一些行来调试它。但我仍然无法弄清楚问题

javascript regex mongodb-query mongoose-populate logic-error
© www.soinside.com 2019 - 2024. All rights reserved.