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
}
}
})
标题可能有误,我有点懵
下面的屏幕显示了我正在使用的架构。
一个小组由老师和学生组成。每个小组有很多小测验,每个小测验有很多问题。
我正在尝试使用测验 _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
}
}
})