[英]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.