gpt4 book ai didi

java - 无法从 MongoDB 中的文档数组中删除最低分数

转载 作者:可可西里 更新时间:2023-11-01 09:24:49 25 4
gpt4 key购买 nike

这是我 Collection 的样子:

db.students.find({_id:100}).pretty()
{
"_id" : 100,
"name" : "Demarcus Audette",
"scores" : [
{
"type" : "exam",
"score" : 30.61740640636871
},
{
"type" : "quiz",
"score" : 14.23233821353732
},
{
"type" : "homework",
"score" : 31.41421298576332
},
{
"type" : "homework",
"score" : 30.09304792394713
}
]
}

我正在 Mongo shell 上执行以下 2 个查询:

x=db.students.aggregate( [{ "$unwind":"$scores" },{"$match":{"scores.type":"homework"}},{ "$group":{"_id":"$_id","minscore":{"$min":"$scores.score" }}} ] )

下一个是:

for (var a in x["a"]) { db.students.update( { "_id":a["_id"] },{"$pull":{"scores":{"score":a["minscore"]}}} ) }

我能够看到最低分数列表,但是当我执行第二个查询时,似乎没有任何内容被删除。我知道有一个逻辑错误。我试着阅读这里的帖子,但无法通过。我只是想知道我哪里出错了。

最佳答案

您的 for 循环中有几个问题 - 尽管您的聚合看起来不错。

您的结果文档“x”包含一个数组字段“result”。您想要遍历该数组中的文档。您拥有的 for 循环语法不会将 a 设置为数组中的值,而是设置为数组中的索引。更好更清晰的方法是使用 forEach 循环语法:

x.result.forEach(function(doc) {
db.students.update( { "_id": doc._id },
{ "$pull": { "scores" : {
"score":doc.minscore,
"type":"homework"
} } }
);
});

您的更新声明也不太准确 - 您想要确保只提取分数最低的家庭作业 - 如果同一个学生有一次考试也是相同的分数怎么办作为他们最低的作业?您的语法将提取得分等于 minscore 的所有子文档!

这个很容易修复(我向您展示了只需要拉取作业子文档所需的语法),但请记住 $pull will pull all values匹配查询,如果只有一项作业,那么它就是 minscore,它将被拉出。如果有两个家庭作业分数相等,他们将被拉!需要考虑的事情。

关于java - 无法从 MongoDB 中的文档数组中删除最低分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19647392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com