如何在MongoDB中提取并打印嵌入数组ticks的所有元素?
解决MongoDB提取嵌套数组ticks的问题
我来帮你搞定这个问题,你的代码主要有两个小问题:一是find()返回的是游标而不是直接的文档,二是投影字段的写法不对。咱们一步步来修正:
问题分析
- 游标 vs 直接文档:
db.collection.find()返回的是一个游标对象,不是你想要的实际文档数据,所以直接print(sections)只会打印游标本身,看不到ticks数组。 - 投影写法错误:你用
{'sections.ticks':[]}是无效的,MongoDB中指定要保留的字段需要用1,排除用0(_id默认会返回,除非你显式指定_id:0)。
解决方案(针对单个sections元素的情况)
因为你的文档里sections是一个只有一个元素的数组,用findOne()更合适(_id是唯一的,只会返回单个文档):
// 1. 获取目标文档,只返回sections.ticks字段(_id默认保留) const projectDoc = db.getCollection('projects').findOne( { _id: "1234678" }, { 'sections.ticks': 1 } ); // 2. 提取ticks数组(sections是数组,取第一个元素的ticks) const ticksArray = projectDoc.sections[0].ticks; // 3. 打印所有值 print("完整ticks数组:", ticksArray); // 或者逐个打印每个值 print("逐个打印ticks值:"); ticksArray.forEach(tick => print(tick));
如果坚持用find()的写法
如果你一定要用find(),需要通过游标方法(比如next()或toArray())获取实际文档:
// 获取游标 const cursor = db.getCollection('projects').find( { _id: "1234678" }, { 'sections.ticks': 1 } ); // 获取第一个文档(因为_id唯一,只有一个结果) const projectDoc = cursor.next(); // 提取并打印ticks const ticksArray = projectDoc.sections[0].ticks; print(ticksArray);
拓展:如果sections有多个元素,提取所有ticks
如果你的sections数组可能包含多个对象,想要提取所有对象里的ticks值,可以用聚合操作:
const aggResult = db.getCollection('projects').aggregate([ { $match: { _id: "1234678" } }, // 匹配目标文档 { $unwind: "$sections" }, // 展开sections数组 { $unwind: "$sections.ticks" }, // 展开每个sections里的ticks数组 { $group: { _id: null, allTicks: { $push: "$sections.ticks" } } } // 把所有ticks收集到一个数组里 ]).next(); const allTicks = aggResult.allTicks; print("所有ticks值:", allTicks);
内容的提问来源于stack exchange,提问作者user14361300
相关产品推荐
相关产品推荐

