为啥使用 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.) 我有一个destroyAction 的服务,它应该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 删除嵌入式子文档数组的元素不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥Node Js mongoose文档删除不等待不执行?

Mongoose 为啥要添加空白数组?

Mongoose 单个嵌入子文档默认

mongoose:使用$ pull删除嵌入式文档数组中的值(MongoDB 3.4版本)

通过 Mongoose、Node.js、MongodB 中的特定属性查找嵌入式文档

Node.js Mongoose 更新嵌入式文档,拉取不持久