为啥使用 Mongoose JS 删除嵌入式子文档数组的元素不起作用?
Posted
技术标签:
【中文标题】为啥使用 Mongoose JS 删除嵌入式子文档数组的元素不起作用?【英文标题】:Why deletion of element of embedded subdocument array using Mongoose JS isn't working?为什么使用 Mongoose JS 删除嵌入式子文档数组的元素不起作用? 【发布时间】:2021-03-30 13:09:17 【问题描述】:1.) 我有两个模型:项目和行动:
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const ProjectSchema = new Schema(
_id: Schema.Types.ObjectId,
title: type: String, default: "default project title" ,
deadline: type: Date, default: "2099-01-01T10:30" ,
description: type: String, default: "default project description" ,
actions: [],
);
module.exports = mongoose.model("Project", ProjectSchema);
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const ActionSchema = new Schema(
_id: Schema.Types.ObjectId,
type: type: String, default: "none" ,
queued: type: Boolean, default: false ,
description: type: String, default: "default description" ,
complete: type: Boolean, default: false ,
waitingFor: [],
setting: type: String, default: "default setting" ,
deadline: type: Date, default: "2099-01-01T10:30"
);
module.exports = mongoose.model("Action", ActionSchema);
2.) 我有一个destroy
和Action
的服务,它应该both 更新Project
动作子文档数组(即删除动作)并从其集合中删除Action
.
它接收到要从数组中删除的Action的ID。
3.) 我尝试了几种方法,但最接近的是:
require("../db");
const mongoose = require("mongoose");
const Action = require("../models/action");
const Project = require("../models/project");
const destroy = async (id) =>
const filter = _id: id ;
const action_id = mongoose.Types.ObjectId(id);
const project_id = mongoose.Types.ObjectId("5fdcd4fdc0d61b7fe59f0940");
Project.updateOne(
,
$pull: actions: _id: id ,
,
arrayFilters: [ "i._id": mongoose.Types.ObjectId(id) ],
new: true,
).then((output => console.log("output of db op: ", output)))
Action.deleteOne(filter, function (err, output)
console.log("output of db op ", output);
);
;
从其集合中删除Action
有效,但Project
不会更新其操作数组。目前,上面的输出是:
db op 的输出: n: 1, nModified: 0, ok: 1 (找到 Project
但不更新!
db op n: 1, ok: 1, deletedCount: 1 的输出(成功从 Action 集合中删除,但 Project 数组未修改)
非常感谢任何有关如何成功更新Project
的建议。谢谢!
【问题讨论】:
【参考方案1】:pull 运算符有时在 MongoDB 中无法正常工作,因此您可以尝试更新并在查询中直接提供 ID 作为 objectID。此外,您需要在更新一中提供您尝试更新的项目的 ID。
Project.update( _id: ObjectId(project_id ) ,
$pull: actions: ObjectId(action_id ) ,
new: true , function (err, source)
if (!err)
console.log('Source log',source);
Action.deleteOne(filter, function (err, output)
console.log("output of db op ", output);
);
else
console.log('Error in deleting projects and actions')
);
【讨论】:
包括项目 ID 查询参数做到了(我认为 mongoose 会根据动作 ID 追捕它,错误的假设)。 “0 modified”的原因是因为它在集合中的第一个项目中寻找一个动作,但没有找到与 ID 匹配的动作。谢谢!以上是关于为啥使用 Mongoose JS 删除嵌入式子文档数组的元素不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
mongoose:使用$ pull删除嵌入式文档数组中的值(MongoDB 3.4版本)