使用猫鼬从数组中删除单个项目

时间:2020-10-13 17:14:44

标签: javascript node.js mongodb express mongoose

我是Web开发的新手,正在制作todo应用程序。我有以下架构和模型:

const tdSchema = new mongoose.Schema({
  category: {
    type: String,
    required: true,
    unique: true
  },
  tds: {
    type: [{
      type: String
    }]
  }
});
const ToDo = mongoose.model("ToDo", tdSchema);

这是一个文档示例:

{ "_id" : ObjectId("5f7e2c3d1a151704382ce109"), 
"todos" : [ "Update Resume", "Apply for jobs" ], 
"category" : "Career", "__v" : 0 }

我想从数组“ todos”中删除“更新简历”,同时将其他所有内容保留在文档中。

如何使用Mongoose JS做到这一点?

2 个答案:

答案 0 :(得分:0)

首先找到文档:

const doc = await ToDo.findOne({ _id: "5f7e2c3d1a151704382ce109" });
console.log(doc);  // optional (used to illustrate how code works)

这将记录:

{ "_id" : ObjectId("5f7e2c3d1a151704382ce109"), 
"todos" : [ "Update Resume", "Apply for jobs" ], 
"category" : "Career", "__v" : 0 }

从这里只需访问“ todos”并从其中删除,就像从典型的JavaScript数组中删除一样。

doc.todos = doc.todos.filter(e => e !== "Update Resume");

然后保存您的文档:

const updated = await doc.save();
console.log(updated);  // optional (used to illustrate how code works)

您将在日志中得到它:

{ "_id" : ObjectId("5f7e2c3d1a151704382ce109"), 
"todos" : [ "Apply for jobs" ], 
"category" : "Career", "__v" : 0 }

答案 1 :(得分:0)

要以@Bilal Saleem的答案为基础,如果您只想运行一个查询并确保如果多个人同时发出请求,该查询就可以工作,则可以使用$pull运算符在更新查询中执行此操作。

$ pull运算符用于从mongodb数组中删除项目,并支持您要提取的项目的查询条件。

const doc = await ToDo.updateOne(
  { _id: "5f7e2c3d1a151704382ce109" },
  {
    $pull: {
      todos: "Update resume",
    }
  }
);

在上述情况下,这将从$pull数组中todos,并删除所有等于"Update resume"的项目