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

Posted

技术标签:

【中文标题】Mongodb通过单个查询在Document和subDocument中搜索【英文标题】:Mongodb search in Document and subDocument through single query 【发布时间】:2021-04-07 05:36:02 【问题描述】:

我有一个包含数组子文档的文档

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

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

样本数据 [2 个文档]


  _id : ObjectId("512e28984815cbfcb21646a7"),
  name: David,
  list: [
    
      sport: basketball,
      score: 100
    ,
    
      sport: cricket,
      score: 30
    
    
      sport: rugby,
      score: 100
    
    ]
,


  _id : ObjectId("879e28664815cbfcb21622g9"),
  name: Shawn,
  list: [
    
      sport: basketball,
      score: 100
    ,
    
      sport: cricket,
      score: 50
    
    
      sport: rugby,
      score: 20
    
    ]

预期结果

大卫得分为 100 的游戏列表

文档查询name = David 子文档查询score = 100

响应:[篮球、橄榄球]


查询已尝试,但结果为 NULL

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

【问题讨论】:

试试findOne(name:'David', list: $elemMatch: score: 100 ) @WernfriedDomscheit 这给了我整个文档.. 列表也包含 !=100 分 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

您可以使用聚合管道。

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

会是这个:

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

【讨论】:

在 cond 时会是双倍的 $ 吗?? 是的,$$this 是默认变量名。见$filter() 和Variables in Aggregation Expressions 这在我的 MongoDB 指南针上工作.. 但是当我把它放在代码中.. 没有给出结果!!! 你能建议我条件吗,如果不是分数,我会用 scoreId ScoreId 将是 ObjectId ..在 ObjectId 比较的情况下 $eq 不工作【参考方案3】:

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

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

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

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

【讨论】:

感谢您的回答...但这只会返回一条子文档记录。我需要数组的所有元素都等于 100【参考方案4】:

只是对已接受答案的充值

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

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

【讨论】:

以上是关于Mongodb通过单个查询在Document和subDocument中搜索的主要内容,如果未能解决你的问题,请参考以下文章

在单个聚合查询 mongodb 中组合多个 $samples

在mongodb的单个查询中获取最小值和最大值

详细教程一文参透MongoDB聚合查询

MongoDB - 多个查询和单个文档结果

[MongoDB]增删改查

mongoDB中单个字段的字符串或整数查询