如何从MongoDB中提取同一键sign的所有非数组字符串值
问题描述
我有如下MongoDB数据库结构:
_id:63457fde325244fe6b157dda name:"Lisa" number:"248XXXXXXX" sign:"scorpio" createdAt:2022-10-11T14:38:22.991+00:00 updatedAt:2022-10-11T14:38:22.991+00:00 __v:0 _id:6345f0996e609ff4da70a6a9 name:"Alyssa" number:"248XXXXXXX" sign:"virgo" createdAt:2022-10-11T14:38:22.991+00:00 updatedAt:2022-10-11T14:38:22.991+00:00 __v:0
我需要提取所有文档中sign字段的字符串值,最终输出每行一个值:
virgo scorpio
我尝试了以下代码但没成功:
function findSign() { sun = ["aries", "taurus", "gemini", "cancer", "leo", "virgo", "libra", "scorpio", "sagittarius", "capricorn", "aquarius", "pisces"] output= [] for(i=0; i<sun.length;i++){ User.find( {sign:sun[i]}, (err, sign) => { sign[i].push(output), console.log(sign) }) } }
请问如何正确实现这个需求?
解决方案
方法一:MongoDB Shell 直接操作
如果直接用MongoDB Shell执行,一行命令就能完成,没必要遍历星座列表:
db.users.find({}, { sign: 1, _id: 0 }).forEach(doc => print(doc.sign))
find({}, { sign:1, _id:0 }):查询所有文档,只保留sign字段,排除默认返回的_idforEach(...):遍历查询结果,每行打印一个sign值
方法二:Mongoose 代码修复(Node.js场景)
你之前的代码有几个核心问题:异步操作顺序混乱、数组操作逻辑错误、冗余遍历星座列表。修复后的代码如下:
异步/await 写法(推荐)
async function findSign() { try { // 查询所有文档,仅返回sign字段,排除_id const userDocs = await User.find({}, 'sign -_id'); // 提取所有sign值并逐行打印 userDocs.forEach(doc => console.log(doc.sign)); // 如果需要收集结果数组,可返回: // return userDocs.map(doc => doc.sign); } catch (error) { console.error('查询失败:', error); } } // 调用函数 findSign();
游标遍历写法(处理大量数据更高效)
如果文档数量较多,用游标逐行处理内存占用更低:
async function findSign() { try { const cursor = User.find({}, 'sign -_id').cursor(); for await (const doc of cursor) { console.log(doc.sign); } } catch (error) { console.error('查询失败:', error); } }
原代码问题说明
- 异步逻辑错误:
User.find是异步操作,循环中的回调会在循环结束后才执行,无法正确按顺序收集结果 - 数组操作颠倒:
sign[i].push(output)是把output数组推到查询结果里,逻辑完全搞反,应该是把查询到的sign值加入output - 冗余遍历:没必要循环所有星座,直接查询所有文档的
sign字段效率高得多
内容的提问来源于stack exchange,提问作者Alyssa Wendt
相关产品推荐
相关产品推荐

