猫鼬按位置/索引更新数组中的项目

Emi*_*che 5 mongoose mongodb node.js

有没有办法用猫鼬更新例如数组中的第二项?

架构:

title: String,
answer: [{
    content: String,
    votes: Number
}]
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我想更新第一个或第二个答案,所以它有 1 票多。

yao*_*ing 6

我不是猫鼬专家。但似乎有一些答案可以参考。
所以简短的回答是肯定的,您可以通过指定其索引来更新数组元素。在外壳中,它将是:

db.collection.update({...}, {$inc: {"answer.0.votes": 1}})
Run Code Online (Sandbox Code Playgroud)

0您要更新的元素的索引在哪里。我相信你可以在猫鼬中找到相应的语法来写这个。

在我看来,通过索引更新数组并不是一个好主意。如果删除/插入元素怎么办?您嵌入的数组元素就像RDBMS. 它们应该具有唯一标识符,例如ObjectId以便更容易定位。建议的数据结构:

{
    title: "This is a question",
    answer: [{
        id: ObjectId("584e6c496c9b4252733ea6fb"),
        content: "Answer",
        votes: 0
    }]
}
Run Code Online (Sandbox Code Playgroud)

并查询id以找到您投票的确切答案:

db.collection.update({"answer": {$elemMatch: {id: ObjectId("584e6c496c9b4252733ea6fb")}}}, {$inc: {"answer.$.votes": 1}});
Run Code Online (Sandbox Code Playgroud)

where$表示数组中匹配的元素。

编辑 - 2018-04-03

  1. 如果只有一个条件,$elemMatch则没有必要。它用于在一个元素中匹配 2 个或多个条件。没有$elemMatch,不同的条件可能会匹配数组中的不同元素。在大多数情况下,这不是预期的。
  2. 从 3.6 开始,MongoDB 引入了$[],它允许您将数组中的所有元素更新为一个update