有没有办法用 Mongoose 更新数组中的第二个项目?
架构:
title: String,
answer: [{
content: String,
votes: Number
}]
就我而言,我想更新第一个或第二个答案,因此它多了 1 票。
最佳答案
我不是 Mongoose 专家。但好像有一些answer可以引用。
所以简短的答案是肯定的,您可以通过指定索引来更新数组元素。在 shell 中它将是:
db.collection.update({...}, {$inc: {"answer.0.votes": 1}})
其中 0
是要更新的元素的索引。我相信你能找到相应的语法如何在 Mongoose 中编写这个。
在我看来,通过索引更新数组并不是一个好主意。如果删除/插入元素怎么办?您嵌入的数组元素就像 RDBMS 中的一对多关系。它们应该具有唯一标识符,例如 ObjectId
,以便更容易找到。建议的数据结构:
{
title: "This is a question",
answer: [{
id: ObjectId("584e6c496c9b4252733ea6fb"),
content: "Answer",
votes: 0
}]
}
并按id
查询以找到您投票的确切答案:
db.collection.update({"answer": {$elemMatch: {id: ObjectId("584e6c496c9b4252733ea6fb")}}}, {$inc: {"answer.$.votes": 1}});
其中$
表示数组中匹配的元素。
编辑 - 2018-04-03
- 如果只有一个条件,则不需要
$elemMatch
。它用于匹配一个元素中的 2 个或多个条件。如果没有$elemMatch
,不同的条件可能会匹配数组中的不同元素。这在大多数情况下是不可预期的。 - 自 3.6 起,MongoDB 推出 $[] ,它允许您在一次
更新
中更新数组中的所有元素。
关于node.js - Mongoose 按位置/索引更新数组中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41097197/