【发布时间】:2020-06-24 09:10:08
【问题描述】:
我在尝试在 for 循环中将 findOneAndUpdate 与猫鼬一起使用时遇到了并发问题。 不要关注给出的例子,而只关注它的方法。 假设我有这个架构:
var PlayerSchema = new Schema({
playername: String,
playerstats:[{
matchNumber: Number,
goals: {
type: Number,
default: 0
}
}]
})
假设我有一年的数组,我想用另一个用 for 循环迭代创建的数组来更新目标,我想做的是为 x = 0 到 5 设置一个 for 循环,其中 x 是 matchNumber score[x] 代表那场比赛的进球数(去年)。如果 matchNumber 存在,我想查看 Player 文档,如果存在,我将使用带有 $set 的 findOneAndUpdate 来设置 scores[x],但它不存在我想使用 $push 使用 score[x] 创建它.让我们给出最容易理解的代码(“马拉多纳”将是我们的球员名字):
function iterateYears(){
years = ["2019", "2020"]
for (var k = 0; k < years.lenght; k++) {
updateScores(k)
}
}
function updateScores(k) {
var scores = []
for (var y = 0; y < 6; y++) {
scores.splice(y, 0, (y * 10) + k)
}
//at this point we would have the first time scores = [0, 10, 20, 30, 40] and second time scores = [1, 11, 21, 31, 41]
for (var x = 0; x < 6; x++) {
Player.findOneAndUpdate({playername: "Maradona", 'playerstats.matchNumber': x}, {$set: {'playerstats.$.goals': scores[x]}}, function(err, matchfound) {
if (err) {
console.log("Err found")
} else {
if (matchfound == null) {
Player.findOneAndUpdate({playername: "Maradona"}, {$push: {playerstats:{matchNumber: x, goals: scores[x]}}}).exec();
}
}
})
}
}
最后我会得到的是:
{
playername: "Maradona",
playerstats:[
{
matchNumber: 0,
goals: 1
},
{
matchnumber: 1,
goals: 11
},
{
matchNumber: 2,
goals: 21
},
{
matchNumber: 3,
goals: 31
},
{
matchNumber: 4,
goals: 41
}
}
但我得到的是这样的:
{
playername: "Maradona",
playerstats:[
{
matchNumber: 0,
goals: 1
},
{
matchNumber: 0,
goals: 0
},
{
matchnumber: 1,
goals: 11
},
{
matchnumber: 1,
goals: 10
},
{
matchNumber: 2,
goals: 21
},
{
matchNumber: 2,
goals: 20
},
{
matchNumber: 3,
goals: 31
},
{
matchNumber: 3,
goals: 30
},
{
matchNumber: 4,
goals: 41
},
{
matchNumber: 4,
goals: 40
}
}
或它们的混合。 发生这种情况是因为代码将尝试使用 $set 来创建 findOneAndUpdate 并且当找不到 matchNumber (matchfound == null) 而不是使用 $push 执行 findOneAndUpdate 来创建它时,它将继续迭代,所以会尝试这样做与 k = 1 的值相同(第二年要澄清),并且需要再次移动到 findOneAndUpdate 与 $push 因为它不会被发现,所以分数 = (x * 10) + k 的值被创建之后,它会返回并使用 $push 和 score = x * 10 生成 findOneAndUpdate。我知道这是它的正常工作,因为单线程但我真的需要有所需的输出。 谢谢大家,很抱歉读了这么久。
【问题讨论】:
标签: javascript node.js mongodb mongoose