微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Mongodb 通过单个查询在 Document 和 subDocument 中搜索

如何解决Mongodb 通过单个查询在 Document 和 subDocument 中搜索

我有一个带有数组子文档的文档

我需要通过单个查询搜索文档和子文档

我只需要子文档数组数据的结果,通过条件

样本数据 [2 个文档]

{
  _id : ObjectId("512e28984815cbfcb21646a7"),name: David,list: [
    {
      sport: basketball,score: 100
    },{
      sport: cricket,score: 30
    }
    {
      sport: rugby,score: 100
    }
    ]
},{
  _id : ObjectId("879e28664815cbfcb21622g9"),name: Shawn,score: 50
    }
    {
      sport: rugby,score: 20
    }
    ]
}

预期结果

David 得分为 100 的游戏列表

回复:[篮球、橄榄球]


查询尝试但结果为NULL

findOne({name:'David',"list.score": 100})

解决方法

要获取大卫得分为 100 的游戏列表,您应该这样做:

const user = await User.findOne({name:'David'}) 
if (user){
    const games = user.list.filter(el => el.score === 100)
    console.log(games)
}
,

您可以使用聚合管道。

  • 名称使用简单的 $match
  • 对于数组使用 $filter 函数

会是这个:

db.collection.aggregate([
  { $match: { name: "David" } },{
    $set: {
      list: {
        $filter: {
          input: "$list",cond: {$eq: ["$$this.score",100] }
        }
      }
    }
  }
])
,

使用elemMatch投影运算符来限制数组的元素:

await User.findOne({name:'David','list.score': 100}).select({list:{$elemMatch:{score:100}})

该示例文档似乎没有在字符串周围显示引号。

请注意,{score:100} 仅在值为数字时才匹配,即它不会匹配 {sport: "basketball",score:"100"}

,

只是对已接受答案的充值

匹配和设置聚合代码也可以从 MongoDB 指南针中生成

Compass 的“聚合”选项卡 --> 导出到语言按钮

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。