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

MongoDB如何查询数组中的对象并返回符合条件的对象?

解决MongoDB数组中匹配特定元素并返回该对象的问题

我来帮你搞定这个MongoDB数组查询的问题~先理清楚你遇到的问题根源,再给你对应的解决方案:

为什么你的前两次查询没得到想要的结果?

  1. 第一次用db.getCollection('Keelung').find({"movie":{"enName": 'Terminal'}}):
    这种写法是在匹配整个movie字段完全等于{enName: 'Terminal'}这个对象,但你的movie是数组类型,所以自然匹配不到任何文档。

  2. 第二次用$elemMatch的查询:
    这个语句会返回包含至少一个符合条件的movie元素的整个文档,而不是单独提取出数组里那个匹配的对象,这应该和你想要的结果不符。

解决方案:根据需求选择合适的查询方式

场景1:只需要数组中第一个匹配的对象

如果你的movie数组里只有一个enName为Terminal的对象,或者只需要第一个匹配项,可以用投影(projection)来提取它:

// 方法1:用位置操作符$
db.getCollection('Keelung').find(
  { "movie.enName": "Terminal" }, // 匹配包含目标元素的文档
  { "movie.$": 1 } // 只返回数组中第一个匹配的元素
)

// 方法2:投影中使用$elemMatch
db.getCollection('Keelung').find(
  { "movie.enName": "Terminal" },
  { "movie": { $elemMatch: { enName: "Terminal" } } }
)

场景2:需要数组中所有匹配的对象

如果movie数组里可能有多个enName为Terminal的对象,想要把它们都提取出来,就得用聚合管道的$filter操作符:

db.getCollection('Keelung').aggregate([
  // 第一步:先过滤出包含目标元素的文档
  { $match: { "movie.enName": "Terminal" } },
  // 第二步:过滤数组,只保留符合条件的元素
  { $project: {
      movie: {
        $filter: {
          input: "$movie",
          as: "m",
          cond: { $eq: ["$$m.enName", "Terminal"] }
        }
      }
    }
  }
])

这两种方式都能帮你精准拿到movie数组中符合条件的对象,根据你的实际数据情况选就行~

内容的提问来源于stack exchange,提问作者Morton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:32:48