MongoDB - 从 object 数组中的 object 数组中检索 object。使用猫鼬

MongoDB - retrive object from an array of objects from an array of objects. Using Mongoose

标题可能有误,我有点懵

下面的屏幕显示了我正在使用的架构。
一个小组由老师和学生组成。每个小组有很多小测验,每个小测验有很多问题。

我正在尝试使用测验 _id 仅检索 1 个测验(及其所有问题)。 我这样做是为了允许用户为小组中的特定测验创建问题。

因此,我尝试通过两种方式检索它。这两种方式我都以所有测验和所有问题结束。
测验和测验2

这是输出。两个命令具有相同的输出

这是邮递员的输入

任何帮助都是好的, 提前致谢

编辑:
J.F。帮我解决了上面的问题。

我现在需要帮助:
向 objects 的测验数组添加问题。
架构保持不变。
我试过的:

最后一个没有完成,但没有用,所以我想我应该停下来寻求帮助。邮递员输入同上

两个查询都无法获取值。

您必须使用投影来获得所需的值。当您进行查询时,您可以使用两个对象:

findOne({query}, {projection})

不,为什么你的代码不起作用:

第一个:使用 mongo 使用 select 使用正确的语法来获取投影,因此这可以工作:

await model.findOne({id:groupId}).select({"quizzes": {
    "$elemMatch": {
      "id": quizId
    }
  }})

第二个:使用mongo查询你必须使用$elemMatch这样进入投影阶段:

model.find({
  "_id": groupId
},
{
  "quizzes": {
    "$elemMatch": {
      "_id": quizId
    }
  }
})

例子here

编辑

要将所需字段更新为数组,您必须使用 positional operator,其定义为:

The positional $ operator identifies an element in an array to update without explicitly specifying the position of the element in the array.

所以你必须找到你想要更新的数组,然后像这样使用位置运算符推送:

db.collection.update({
  "_id": 1,
  "quizzes._id": 1
},
{
  "$push": {
    "quizzes.$.questions": {
      // your object
    }
  }
})

请注意,更新查询有两个对象:update({obj1}, {obj2})

第一个对象是查找更新位置的查询。在这种情况下,我想用 _id 1 更新测验。

查找对象已找到一个文档,因此,我们告诉 mongo 使用 quizzes.$.questions 更新对象:您找到的测验更新问题字段推送对象。

示例here

使用 mongoose 就像使用相同的查询一样简单:

var update = await model.updateOne({
    "_id": groupId,
    "quizzes._id": quizId
  },
  {
    "$push": {
      "quizzes.$.questions": {
        // your fields
      }
    }
  })