使用Map处理Mongo结果返回含Null值数组,需移除_id和__v属性
解决MongoDB查询结果用Map移除_id和__v后返回Null数组的问题
我猜你大概率是在map回调里忘记显式返回处理后的对象了,或者解构/赋值的时候出了小问题,导致每一次map迭代都返回undefined(最终被JSON序列化为null)。下面给你几种靠谱的解决方式:
方式1:修复Map回调的返回逻辑
如果你的原始代码是类似这样的(没有return):
// 错误示例:没有return,导致每一项返回undefined,最终转成null const processedMarkers = markers.map(marker => { { name: marker.name, lat: marker.lat, lng: marker.lng // 这里没写return! } });
改成这样,确保回调里返回处理后的对象:
// 正确写法:显式return对象 const processedMarkers = markers.map(marker => { return { name: marker.name, lat: marker.lat, lng: marker.lng // 只保留你需要的字段,自动排除_id和__v }; });
或者更简洁的箭头函数写法(用括号包裹对象,避免被当成代码块):
// 更简洁的箭头函数写法:用剩余参数直接剔除不需要的字段 const processedMarkers = markers.map(({ _id, __v, ...rest }) => rest);
这里用了ES6的剩余参数语法,直接把_id和__v从对象里剔除,剩下的rest就是你需要的属性集合,非常高效。
方式2:从MongoDB查询阶段直接排除字段(更推荐)
其实根本不需要在拿到结果后再用map处理,直接在MongoDB的查询语句里就可以排除_id和__v,这样性能更好,也避免后续处理出错:
如果你用的是Mongoose:
// 查询时直接指定要排除的字段 Marker.find({}, '-_id -__v').exec() .then(markers => { // 这里拿到的markers已经没有_id和__v了,直接用就行 res.json(markers); }) .catch(err => { // 处理错误逻辑 });
或者用select方法:
Marker.find().select('-_id -__v').exec() .then(markers => res.json(markers)) .catch(err => console.error(err));
为什么会返回Null数组?
当你在map的回调函数里没有返回任何值时,每一次迭代都会返回undefined,而当把包含undefined的数组转成JSON时,undefined会被序列化为null,这就是你看到null数组的原因。举个例子:
const arr = [{_id: 1, name: 'A'}, {_id:2, name: 'B'}]; // 错误:没有return const badResult = arr.map(item => { {name: item.name} }); console.log(badResult); // [undefined, undefined] // 转成JSON后就变成 [null, null]
内容的提问来源于stack exchange,提问作者Nikola Stojaković
相关产品推荐
相关产品推荐

