You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MongoDB .find()方法读取嵌套JSON元素的问题求助

问题原因

你当前的查询匹配逻辑是正确的,异常结果不是输出方式的问题,而是投影配置不符合预期:
你使用的{projection : { transactions: {user : 1}} }规则只会保留返回文档中transactions字段下每个元素的user属性,不会过滤掉transactions数组内不符合user=eltaieyo的元素,也不会返回交易记录的其他字段。

解决方法

方案1:仅获取第一个匹配的交易记录(用$elemMatch投影)

如果只需要返回transactions数组中第一个符合条件的元素,可以直接修改find的投影配置:

blockChainModel.find(
  {"transactions.user": "eltaieyo"},
  { 
    transactions: { $elemMatch: { user: "eltaieyo" } },
    _id: 0 // 可选,不需要返回_id的话可以加这个配置
  },
  (err, blocks) => {
    if (err) return console.error("Cannot find the specified Blocks", err);
    // 遍历获取每个文档的匹配交易内容
    blocks.forEach(block => console.log(block.transactions));
  }
);

方案2:获取所有匹配的交易记录(用聚合管道)

如果需要返回transactions数组中所有符合条件的元素,使用聚合查询:

blockChainModel.aggregate([
  // 匹配包含目标用户交易的文档,缩小查询范围
  { $match: {"transactions.user": "eltaieyo"} },
  // 拆分transactions数组为独立文档
  { $unwind: "$transactions" },
  // 过滤出目标用户的交易记录
  { $match: {"transactions.user": "eltaieyo"} },
  // 可选:按原文档分组,重新组装为数组
  { $group: {
    _id: "$_id",
    transactions: { $push: "$transactions" }
  }}
], (err, results) => {
  if (err) return console.error("查询失败", err);
  console.log(results);
})

方案3:获取文档完整的transactions数组

如果不需要过滤数组元素,只需要返回该文档下所有交易记录,修改投影配置即可:

blockChainModel.find(
  {"transactions.user": "eltaieyo"},
  { transactions: 1, _id: 0 },
  (err, blocks) => {
    if (err) return console.error("Cannot find the specified Blocks", err);
    console.log(blocks);
  }
);

内容的提问来源于stack exchange,提问作者younes.xd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:45:02