【问题标题】:MongoDB - retrive object from an array of objects from an array of objects. Using MongooseMongoDB - 从对象数组中检索对象数组。使用猫鼬
【发布时间】:2021-05-13 17:42:40
【问题描述】:

标题可能是错误的,我有点困惑。

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

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

所以,我尝试通过两种方式检索它。两种方式我最终都会完成所有测验和所有问题。
测验和测验2

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

这是邮递员的输入

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

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

我现在需要帮助:
向 quizzes 对象数组添加问题。
架构保持不变。
我尝试了什么:

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

【问题讨论】:

  • 在投影中使用$elemMatch 应该可以工作,请检查here。还可以尝试使用:groupsModel.findOne({"_id": groupId},{"quizzes": {"$elemMatch": {"_id": quizId}}}),因为在您的第二个查询中,您没有将 $elemMatch 用于投影阶段,而是在查询阶段。

标签: arrays mongodb object mongoose collections


【解决方案1】:

两个查询都不正确,无法获取值。

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

findOne({query}, {projection})

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

第一个:使用猫鼬获取投影的正确语法是使用select,所以这可以工作:

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

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

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

例如here

编辑

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

位置 $ 运算符标识数组中要更新的元素,而无需明确指定该元素在数组中的位置。

所以你必须找到你想要更新的数组并使用位置运算符推送,如下所示:

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

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

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

Find object 找到了一个文档,因此,我们在更新对象中使用quizzes.$.questions 告诉 mongo:The quizz you have found update questions field pushing the object。

例如here

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

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

【讨论】:

  • 这很有帮助,非常感谢。我现在正尝试在测验中插入问题。你能帮我解决这个问题吗?我今天试着自己做,但我失败了。我将在问题底部发布我尝试过的方式的代码。如果可以的话,让我知道我做错了什么以及如何解决它。谢谢。
  • 那是我在底部添加了一个编辑。如果你有时间 - 创建一个新的答案。 cmets 很难阅读。
  • 今天晚些时候我会试试。非常感谢
  • 一切正常,再次感谢您。另外,我真的很感谢你的解释。干杯。
猜你喜欢
  • 2019-06-21
  • 2021-10-28
  • 2015-12-28
  • 2021-05-06
  • 2017-06-13
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多