[英]Update a subdocument in mongoDB using mongoose
import mongoose, { Schema, model } from 'mongoose';
const TodoSchema = new Schema({
task: {
type: String,
required: [true, 'Task is required'],
},
date: {
type: Date,
default: Date.now,
},
tags: {
type: [String],
},
});
const UserSchema = new Schema({
name: String,
googleId: Number,
date: { type: Date, default: Date.now },
email: String,
picture: String,
todos: {
type: [TodoSchema],
},
});
googleId
查詢用戶todos
數組中的 (todo) _id
的 todoconst user = await User.findOne({ googleId });
const { todos } = user;
const idx = todos.findIndex((td) => td._id == todoId);
todos[idx].task = task;
todos[idx].tags = tags;
const { todos: updatedTodos } = await user.save();
我的方法確實有效,但它似乎不是一個最佳解決方案,就像在 todo 模式中更改或添加更多字段的情況一樣。 雖然我確實考慮過使用擴展運算符,但是每次更新 todo 時都會產生新的 todo id
我應該如何使用 mongoose 做到這一點?
如果你有 todos 的 Schema,這意味着每個 todo 在 MongoDB 中都有一個唯一的 id。 您不必在步驟 2 中過濾待辦事項:
STEP 1:
const user = await User.findOne({ googleId });
const { todos } = user;
STEP 2: // don't do this
const idx = todos.findIndex((td) => td._id == todoId);
STEP 3:
todos[idx].task = task;
todos[idx].tags = tags;
STEP 4:
const { todos: updatedTodos } = await user.save();
考慮一下:
findByIdAndUpdate
下使用 findByIdAndUpdate我的建議:
const todoId = xxxxxxxxx
const user = await User.findOne({googleId})
const orderIdBelongsToUser = user.todos.includes(todoId)
// I'm assuming this is an array of orderIds, otherwise you can decide whether or not to do this check.
// It seems pretty redundant, if you already have the todo id.
const newTodoObject = {
task: xxxx,
tags: xxxxx
}
if (orderIdBelongsToUser) {
const response = await Todo.findByIdAndUpdate(todoId, newTodoObject)
}
希望我能提供幫助。
參考: https://mongoosejs.com/docs/api.html#model_Model.findByIdAndUpdate
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.