node.js - Mongoose 按位置/索引更新数组中的项目

标签 node.js mongodb mongoose

有没有办法用 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

  1. 如果只有一个条件,则不需要 $elemMatch。它用于匹配一个元素中的 2 个或多个条件。如果没有 $elemMatch,不同的条件可能会匹配数组中的不同元素。这在大多数情况下是不可预期的。
  2. 自 3.6 起,MongoDB 推出 $[] ,它允许您在一次更新中更新数组中的所有元素。

关于node.js - Mongoose 按位置/索引更新数组中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41097197/

相关文章:

mongodb - 需要在 mongodb 中使用自定义结果填充 block 中所需的结果

node.js - Mongoose 用于根据产品类型具有不同属性的产品系统

javascript - Node.js Heroku 部署 - 无法执行安装后脚本来安装 Bower

windows - 在 Windows Server 2008 上安装 javascript 驱动程序 Mongodb-native

javascript - Node 需要用方括号传递 arg 的模块?这是一个错误吗?

mongodb - 我如何订购列表并在 MongoDB 上为其项目添加位置?

javascript - POST JSON 到 Node.JS ,语法错误 : Unexpected token %

node.js - 将 excel(.xlsx) 文件转换为 JSON

multithreading - Node 线程是否是模拟循环的错误位置?

javascript - 错误: socket hang up using https