如何从数组中获取单个项目并将其显示为 object?而不是作为数组 Mongodb

How can I get a single item from the array and display it as an object? and not as an array Mongodb

我有一个 collection,我需要从中获取特定对象,例如notes.blok2notes.curse5 作为 object,而不是数组

{
  "year":2020,
  "grade":4,
  "seccion":"A",
    "id": 100,
  "name": "pedro",
  "notes":[{"curse":5, 
          "block":1, 
          "score":{ "a1": 5,"a2": 10, "a3": 15} 
          },{"curse":5, 
          "block":2, 
          "score":{ "b1": 10,"b2": 20, "b3": 30} 
          }
   ]
}

我的查询

notas.find({
"$and":[{"grade":1},{"seccion":"A"},{"year":2020}]},
{"projection":{ "grade":1, "seccion":1,"name":1,"id":1,
"notes":{"$elemMatch":{"block":2,"curse":5}},"notes.score":1} })

它有效,但 returns 像数组

{
  "_id": "55",
  "id": 100,
  "grade": 5,
  "name": "pedro",
  "seccion": "A",
  "notes": [
    {"score": { "b1": 10,"b2": 20, "b3": 30} }
  ]
}

但我需要这样:score 与其他人处于同一级别,如果不存在则显示为空 "score":{}

{
  "year":2020,
  "grade":5,
  "seccion":"A",
    "id": 100,
  "name": "pedro",
  "score":{ "b1": 10,"b2": 20, "b3": 30} 
}

演示 - https://mongoplayground.net/p/XlJqR2DYW1X

可以使用聚合查询

db.collection.aggregate([
  {
    $match: { // filter
      "grade": 1,
      "seccion": "A",
      "year": 2020,
      "notes": {
        "$elemMatch": {
          "block": 2,
          "curse": 5
        }
      }
    }
  },
  { $unwind: "$notes" },  //break into individual documents
  {
    $match: { // match query on individual note
      "notes.block": 2,
      "notes.curse": 5
    }
  },
  {
    $project: { // projection
      "grade": 1,
      "seccion": 1,
      "name": 1,
      "id": 1,
      "score": "$notes.score"
    }
  }
])

更新

演示 - https://mongoplayground.net/p/mq5Kue3UG42

使用$filter

db.collection.aggregate([
  {
    $match: {
      "grade": 1,
      "seccion": "A",
      "year": 2020
    }
  },
  {
    $set: {
      "score": {
        "$filter": {
          "input": "$notes",
          "as": "note",
          "cond": {
            $and: [
              {
                $eq: [ "$$note.block",3]
              },
              {
                $eq: [ "$$note.curse", 5 ]
              }
            ]
          }
        }
      }
    }
  },
  {
    $project: {
      // projection
      "grade": 1,
      "seccion": 1,
      "name": 1,
      "id": 1,
      "score": {
        "$first": "$score.score"
      }
    }
  }
])

如果你想在找不到匹配项时为分数设置空对象,你可以这样做 -

演示 - https://mongoplayground.net/p/dumax58kgrc

  {
    $set: {
      score: {
        $cond: [
          { $size: "$score" }, // check array length
          { $first: "$score" }, // true - take 1st
          { score: {} } // false - set empty object
        ]
      }
    }
  },