MongoDB如何查询数组子文档:获取指定股票指定日期行情
如何查询指定股票代码和日期的行情子文档
针对你给出的MongoDB股票数据结构,以下是两种获取指定股票(如AAPL)指定日期(如2022-04-25)行情子文档的方法:
方法1:使用find()查询
这种方式简洁直接,适合单条件的数组元素匹配:
写法一:基础过滤+投影
db.stocks.find( { ticker: 'AAPL', 'quotes.date': '2022-04-25' }, { 'quotes.$': 1, _id: 0 } )
- 第一个参数:过滤出股票代码为
AAPL,且行情数组中包含指定日期的文档 - 第二个参数:
quotes.$表示只返回数组中匹配到的第一个元素,_id: 0用于隐藏默认返回的_id字段
写法二:使用$elemMatch明确匹配数组元素
db.stocks.find( { ticker: 'AAPL', quotes: { $elemMatch: { date: '2022-04-25' } } }, { 'quotes.$': 1, _id: 0 } )
效果和写法一一致,$elemMatch更清晰地指定了数组元素的匹配条件,适合数组多字段匹配场景。
方法2:使用aggregate()聚合查询
聚合查询灵活性更高,适合需要对数据做后续处理的场景:
写法一:投影出目标行情
db.stocks.aggregate([ { $match: { ticker: 'AAPL' } }, // 先筛选出AAPL的文档 { $unwind: '$quotes' }, // 把行情数组拆分成单个文档 { $match: { 'quotes.date': '2022-04-25' } }, // 筛选指定日期的行情 { $project: { _id: 0, quote: '$quotes' } } // 只保留行情数据,去掉_id ])
写法二:直接返回行情子文档
如果希望结果就是纯粹的行情数据,不带外层结构,可以用$replaceRoot:
db.stocks.aggregate([ { $match: { ticker: 'AAPL' } }, { $unwind: '$quotes' }, { $match: { 'quotes.date': '2022-04-25' } }, { $replaceRoot: { newRoot: '$quotes' } } // 将行情子文档设为结果根文档 ])
内容的提问来源于stack exchange,提问作者Pawan
相关产品推荐
相关产品推荐

