如何在Mongo Shell脚本中获取指定键值及遍历游标?
问题分析与解决:Mongo Shell中游标访问与遍历问题
你在Mongo Shell中执行了以下代码:
const records = db.issues.find().limit(1); print('Record:', records); print('ID:', records.id);
执行后输出:
Record: [ { _id: ObjectId("63f94e684902f564f7d418ca"), id: 1, status: 'New', owner: 'Ravan', effort: 5, created: ISODate("2019-01-15T00:00:00.000Z"), due: null, title: 'Error in console when clicking Add', description: 'Steps to recreate the problem:\n' } ] ID:
为什么records.id取不到值?
核心原因是**db.issues.find().limit(1)返回的是游标对象,不是直接的文档数据**。
Mongo Shell在执行print('Record:', records)时,会自动迭代游标并输出文档数组,但变量records本身仍然是游标类型——游标对象没有id属性,所以records.id自然无法获取到文档里的id值,只会输出ID:。
要正确获取单条文档的id,需要手动从游标中取出文档:
方法1:用next()获取单条文档
const records = db.issues.find().limit(1); const doc = records.next(); // 取出游标中的唯一文档 print('Record:', doc); print('ID:', doc.id); // 此时会输出ID: 1
方法2:用toArray()转成数组后访问
const records = db.issues.find().limit(1).toArray(); print('Record:', records); print('ID:', records[0].id); // 通过数组索引访问第一个文档的id
如何遍历多条记录的游标?
当查询返回多条记录时,常用的遍历方式有三种:
1. 使用游标forEach()方法(推荐)
直接对游标调用forEach,传入处理每个文档的函数:
db.issues.find().forEach(function(doc) { print(`文档ID: ${doc.id},标题: ${doc.title}`); });
2. 使用while循环配合hasNext()和next()
手动判断游标是否还有下一个文档,逐个取出处理:
const cursor = db.issues.find(); while (cursor.hasNext()) { const doc = cursor.next(); print(`文档ID: ${doc.id},状态: ${doc.status}`); }
3. 转成数组后遍历(适合小数据量)
先把游标转为数组,再用普通数组遍历方式处理:
const docs = db.issues.find().toArray(); for (let i = 0; i < docs.length; i++) { print(`第${i+1}条文档标题: ${docs[i].title}`); }
内容的提问来源于stack exchange,提问作者chris-j
相关产品推荐
相关产品推荐

