如何使用Mongoose Filter Object按用户名列出车辆?
使用 Mongoose Filter Object 按用户名列出车辆
先确认数据模型结构
车辆和用户的关联通常有两种存储方式,先对应你的模型情况来处理:
方式1:车辆模型直接存用户名
这种是最简单的,直接在车辆文档里用字符串存关联的用户名:
const carSchema = new mongoose.Schema({ model: String, brand: String, username: String, // 直接存储关联的用户名 // 其他字段比如颜色、年份等 }); const Car = mongoose.model('Car', carSchema);
方式2:车辆模型通过ObjectId关联User模型
如果用户信息存在单独的User集合里,车辆文档存用户的ObjectId:
const carSchema = new mongoose.Schema({ model: String, brand: String, user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' // 关联User模型 }, // 其他字段 }); const Car = mongoose.model('Car', carSchema);
构建Filter Object执行查询
根据你的模型结构,用对应的过滤条件查车:
对应方式1(直接存用户名)
直接把目标用户名作为过滤条件就行,一步到位:
// 要查询的用户名 const targetUsername = 'john_doe'; // 构建filter对象 const filter = { username: targetUsername }; // 查询返回该用户的所有车辆 const userCars = await Car.find(filter); console.log(userCars);
对应方式2(关联User模型)
有两种实现思路:
思路1:先查用户ID,再查车辆
先通过用户名找到用户的ObjectId,再用这个ID过滤车辆:
const targetUsername = 'john_doe'; // 先找到对应用户 const user = await User.findOne({ username: targetUsername }); if (!user) { console.log('找不到该用户'); return; } // 用用户ID构建filter const filter = { user: user._id }; // 用populate可以顺便把用户信息一起返回 const userCars = await Car.find(filter).populate('user'); console.log(userCars);
思路2:用聚合查询一次性关联查询
如果不想分两次查,用聚合的$lookup关联用户集合,再过滤用户名:
const targetUsername = 'john_doe'; const userCars = await Car.aggregate([ { $lookup: { from: 'users', // 注意这里是User模型对应的集合名(默认是复数) localField: 'user', foreignField: '_id', as: 'userInfo' } }, { $match: { 'userInfo.username': targetUsername } }, { $unwind: '$userInfo' // 把数组形式的userInfo展开成对象 } ]); console.log(userCars);
额外:组合其他过滤条件
如果还要加品牌、年份这类条件,直接往filter对象里加就行:
const filter = { username: 'john_doe', brand: 'Toyota', year: { $gte: 2020 } // 只查2020年及以后的丰田车 }; const filteredCars = await Car.find(filter);
内容的提问来源于stack exchange,提问作者Ali Parlatti
相关产品推荐
相关产品推荐

