Node.js中MongoDB查询返回不完整问题求助
排查Node.js查询MongoDB偶发字段缺失问题
问题描述
在Node.js环境中查询MongoDB时,偶发出现部分文档字段缺失的情况:有时能返回完整数据,有时部分文档(如返回结果中的第二个对象)会丢失parkingId、user、date等多个字段。
返回结果示例
{ "62d12069cb03235286511d5e": [ { "duration": {}, "isBookingCancelled": {}, "_id": "62d55611f4a5817f6b0441c6", "parkingId": "62d12069cb03235286511d5e", "user": "62c9511cc96c2b690028be91", "date": "2022-07-22T00:00:00.000Z", "startTime": "2022-07-22T06:30:00.000Z", "endTime": "2022-07-22T08:30:00.000Z", "isFeePaid": false, "status": "sent", "isStarted": false, "isEnabled": false, "createdAt": "2022-07-18T12:46:09.040Z", "updatedAt": "2022-07-18T12:46:09.040Z", "__v": 0 }, { "duration": {}, "isEnabled": false, "createdAt": "2022-07-18T12:49:49.921Z", "updatedAt": "2022-07-18T12:49:49.921Z", "__v": 0 } ] }
查询代码
const bookings = await Booking.find({ "isBookingCancelled.value": false, // parkingId: { $in: parkingIds }, }); let groupBookings = {}; let tmppid = ""; bookings.forEach((booking) => { tmppid = booking.parkingId.toString(); if (typeof groupBookings[tmppid] === "undefined") groupBookings[tmppid] = []; groupBookings[tmppid].push(booking); }); console.log(groupBookings);
Booking Schema定义
parkingId: 关联Parking集合user: 关联auth集合date: 日期字段startTime: 开始时间duration: 包含days、hours、minutes的嵌套对象endTime: 结束时间isBookingcancelled: 注意此处字段名是小写cisFeePaid: 布尔值,标记费用是否支付isStarted: 布尔值,标记是否已开始isEnabled: 布尔值,标记是否启用paymentId: 关联Payment集合status: 状态字段
排查方向
字段名大小写不一致问题
注意到Schema定义中取消预订的字段是isBookingcancelled(小写c),但查询条件用的是isBookingCancelled(大写C)。如果部分文档写入时用了小写c的字段名,会导致查询条件不匹配,但这类文档却出现在结果中,说明实际数据的字段名存在不统一的情况,需要检查写入Booking文档的代码,确保字段名和Schema一致。Mongoose Document对象序列化问题
Mongoose默认返回的是Document实例,不是纯JavaScript对象,console.log时可能因为内部机制导致部分字段未被完整显示。可以在查询时添加.lean()方法,返回纯JS对象后再打印验证:const bookings = await Booking.find({ "isBookingCancelled.value": false, }).lean();数据写入不完整
偶发的字段缺失可能是创建Booking文档时的逻辑问题:某些分支场景下,parkingId、user等字段未被赋值就执行了保存操作。需要检查创建Booking的代码,确保所有必填字段在任何场景下都能被正确赋值。控制台打印截断
Node.js的console.log对于复杂对象可能会截断显示,看起来像字段缺失但实际数据完整。可以改用JSON序列化后打印,确认真实数据结构:console.log(JSON.stringify(groupBookings, null, 2));
内容的提问来源于stack exchange,提问作者Talc
相关产品推荐
相关产品推荐

