簡體   English   中英

Mongoose 更新包含特定 Array 元素的許多文檔

[英]Mongoose updateMany documents containing specific Array element

我有一個Mongoose模式設置如下:

const mongoose = require('mongoose');

const TodoSchema = mongoose.Schema({
  id: {
    type: String,
    required: true,
  },
  todos: {
    type: Array,
    required: true,
  },
  date: {
    type: Date,
    default: Date.now(),
  },
});

module.exports = mongoose.model('todo', TodoSchema, 'todos');

todos Array 中的每個元素都是一個 Object 並且具有以下格式(示例):

{
  id: 1,
  todo: "Do the dishes."
  category: "Kitchen"
}

我的Todo集合中有多個文檔,它們都包含相同的Todo列表。 如果我想在所有文檔中更新特定的 Todo,我想我需要使用updateMany 我在 Todo Update 路由中使用以下內容來更新 Todo 的所有實例:

const { todo } = req.body; // todo.todo contains "Clean the dishes." as an update

Todo.updateMany(
  {
    todos: { $elemMatch: { id: todo.id } },
  },
  { $set: { todo: todo } }
);

我將上述路由代碼的結果分配給一個變量並控制台記錄返回的結果:

{ ok: 0, n: 0, nModified: 0 }

我究竟做錯了什么? 傳遞的todo id 與每個Todos數組中的 Todo id 匹配。

首先,對於您的對象數組,建議也創建一個架構:

const subSchema = new mongoose.Schema({
    id: Number,
    todo: String,
    category: String
})
const MongooseModel = new mongoose.Schema({
    id: String,
    todos: [subSchema],
    date: Date
})

所以現在,您的數組對象已定義。

而且,查詢問題是這樣的:

db.collection.update({
  "todos.id": todo.id
},
{
  "$set": {
    "todos.$": {newTodo}
  }
},
{
  "multi": true
})

首先,您尋找符合您標准的所有元素; 即: todos.id = todo.id ,然后您使用$運算符來設置與您的對象匹配條件的所有元素。 最后一行multi是更新所有匹配的元素。

示例游樂場在這里

使用 Moongoose, multi屬性不是必需的,因為默認情況下使用updateMany()設置為true

所以moongose 查詢應該是這樣的。

var update = await model.updateMany(
    {
        "todos.id": 1
    },
    {
    "$set": {
        "todos.$": {
            "id": 20,
            "todo": "newTodo",
            "category": "newCategory"
        }
    }
})

對於這個示例數據,結果是

{ n: 3, nModified: 3, ok: 1 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM