MongoDB如何查询数组中的对象并返回符合条件的对象?
解决MongoDB数组中匹配特定元素并返回该对象的问题
我来帮你搞定这个MongoDB数组查询的问题~先理清楚你遇到的问题根源,再给你对应的解决方案:
为什么你的前两次查询没得到想要的结果?
第一次用
db.getCollection('Keelung').find({"movie":{"enName": 'Terminal'}}):
这种写法是在匹配整个movie字段完全等于{enName: 'Terminal'}这个对象,但你的movie是数组类型,所以自然匹配不到任何文档。第二次用
$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
相关产品推荐
相关产品推荐

