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

Mongodb search in Document and subDocument through single query

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

我需要通过单个查询

搜索文档和子文档

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

示例数据 [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})

要获得 David 得分为 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 的聚合选项卡 --> 导出到语言按钮