如何从用户集合中删除孤立的 objectid 引用?
How to delete orphaned objectid reference from the users collection?
查找用户的控制器函数:
router.get("/:id", usersController.getUser)
getUser: async (req, res, next) => {
try {
const user = await User.findById(req.params.id)
if (!user) {
return res.status(404).json({ message: "User not found" })
}
return res.status(200).json({ user })
} catch (error) {
return next(error)
}
}
我得到了这样的回复:
{
"user": [
{
"posts": [
"5e857785591a6c1047341c60",
"5e85779f591a6c1047341c61"
],
"_id": "5e84e15ef2ae067df522c164",
"username": "rick",
"email": "rickk3@gmail.com",
"password": "b$FRHysk3eBMEOfS3FAT1nEe9voFH9yETR.3V1ZTJkg8Ekwtt6TlJ.W",
"createdAt": "2020-04-01T18:45:50.029Z",
"updatedAt": "2020-04-02T05:26:55.722Z",
"__v": 9
}
]
}
router.delete("/:id/delete", postsController.deletePost)
正在删除一个 post 控制器函数:
deletePost: async (req, res, next) => {
try {
const post = await Post.findByIdAndDelete(req.params.id)
if (!post) {
return res.status(200).json({ error: "No post found"})
}
res.status(200).json({ post })
} catch(error) {
console.log(error)
}
}
localhost:3000/api/v1/posts/5e857785591a6c1047341c60/delete
删除 post 后,我得到了这样的回复:
{
"post": {
"_id": "5e857785591a6c1047341c60",
"title": "helloooo",
"description": "hello there",
"user": "5e84e15ef2ae067df522c164",
"createdAt": "2020-04-02T05:26:29.637Z",
"updatedAt": "2020-04-02T05:26:29.637Z",
"__v": 0
}
}
现在,在删除 post 后,我希望删除 post 在 users
集合中的 ObjectID
引用。
现在,在数据库中,用户文档如下所示:
{
"_id" : ObjectId("5e84e15ef2ae067df522c164"),
"posts" :
[
ObjectId("5e857785591a6c1047341c60"),
ObjectId("5e85779f591a6c1047341c61")
],
"username" : "rick",
"email" : "rickk3@gmail.com",
"password" : "b$FRHysk3eBMEOfS3FAT1nEe9voFH9yETR.3V1ZTJkg8Ekwtt6TlJ.W",
"createdAt" : ISODate("2020-04-01T18:45:50.029Z"),
"updatedAt" : ISODate("2020-04-02T05:26:55.722Z"),
"__v" : 9
}
因此,在您成功删除 Post
后,调用 user
集合以从 posts
数组中提取特定的 post id。
试试下面的代码:
const mongoose = require("mongoose");
deletePost: async (req, res, next) => {
try {
const post = await Post.findByIdAndDelete(req.params.id);
if (!post) {
return res.status(200).json({ error: "No post found" });
}
await User.update(
{ _id: mongoose.Types.ObjectId(post.user) },
{ $pull: { "posts": mongoose.Types.ObjectId(post._id) } }
); /** You can check for n updated to make sure this operation is successful or else can re-try again */
res.status(200).json({ post });
} catch (error) {
console.log(error);
}
};
轻松使用猫鼬
https://mongoosejs.com/docs/api/model.html#model_Model.findByIdAndDelete
var users = require('../Models/User.model');
users.findOneAndRemove({ _id: req.params.id }, function (err) {
if (err) {
console.log("when delete account Encountered an error !");
}
res.redirect('/Account/index');
});
../Models/User.model.js 例子
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var usersSchema = new Schema({
username: { type: String, required: true/* , unique: true */ },
password: { type: String, required: true },
date: { type: Date, default: Date.now }
});
var users = mongoose.model('users', usersSchema);
module.exports = users;
查找用户的控制器函数:
router.get("/:id", usersController.getUser)
getUser: async (req, res, next) => {
try {
const user = await User.findById(req.params.id)
if (!user) {
return res.status(404).json({ message: "User not found" })
}
return res.status(200).json({ user })
} catch (error) {
return next(error)
}
}
我得到了这样的回复:
{
"user": [
{
"posts": [
"5e857785591a6c1047341c60",
"5e85779f591a6c1047341c61"
],
"_id": "5e84e15ef2ae067df522c164",
"username": "rick",
"email": "rickk3@gmail.com",
"password": "b$FRHysk3eBMEOfS3FAT1nEe9voFH9yETR.3V1ZTJkg8Ekwtt6TlJ.W",
"createdAt": "2020-04-01T18:45:50.029Z",
"updatedAt": "2020-04-02T05:26:55.722Z",
"__v": 9
}
]
}
router.delete("/:id/delete", postsController.deletePost)
正在删除一个 post 控制器函数:
deletePost: async (req, res, next) => {
try {
const post = await Post.findByIdAndDelete(req.params.id)
if (!post) {
return res.status(200).json({ error: "No post found"})
}
res.status(200).json({ post })
} catch(error) {
console.log(error)
}
}
localhost:3000/api/v1/posts/5e857785591a6c1047341c60/delete
删除 post 后,我得到了这样的回复:
{
"post": {
"_id": "5e857785591a6c1047341c60",
"title": "helloooo",
"description": "hello there",
"user": "5e84e15ef2ae067df522c164",
"createdAt": "2020-04-02T05:26:29.637Z",
"updatedAt": "2020-04-02T05:26:29.637Z",
"__v": 0
}
}
现在,在删除 post 后,我希望删除 post 在 users
集合中的 ObjectID
引用。
现在,在数据库中,用户文档如下所示:
{
"_id" : ObjectId("5e84e15ef2ae067df522c164"),
"posts" :
[
ObjectId("5e857785591a6c1047341c60"),
ObjectId("5e85779f591a6c1047341c61")
],
"username" : "rick",
"email" : "rickk3@gmail.com",
"password" : "b$FRHysk3eBMEOfS3FAT1nEe9voFH9yETR.3V1ZTJkg8Ekwtt6TlJ.W",
"createdAt" : ISODate("2020-04-01T18:45:50.029Z"),
"updatedAt" : ISODate("2020-04-02T05:26:55.722Z"),
"__v" : 9
}
因此,在您成功删除 Post
后,调用 user
集合以从 posts
数组中提取特定的 post id。
试试下面的代码:
const mongoose = require("mongoose");
deletePost: async (req, res, next) => {
try {
const post = await Post.findByIdAndDelete(req.params.id);
if (!post) {
return res.status(200).json({ error: "No post found" });
}
await User.update(
{ _id: mongoose.Types.ObjectId(post.user) },
{ $pull: { "posts": mongoose.Types.ObjectId(post._id) } }
); /** You can check for n updated to make sure this operation is successful or else can re-try again */
res.status(200).json({ post });
} catch (error) {
console.log(error);
}
};
轻松使用猫鼬 https://mongoosejs.com/docs/api/model.html#model_Model.findByIdAndDelete
var users = require('../Models/User.model');
users.findOneAndRemove({ _id: req.params.id }, function (err) {
if (err) {
console.log("when delete account Encountered an error !");
}
res.redirect('/Account/index');
});
../Models/User.model.js 例子
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var usersSchema = new Schema({
username: { type: String, required: true/* , unique: true */ },
password: { type: String, required: true },
date: { type: Date, default: Date.now }
});
var users = mongoose.model('users', usersSchema);
module.exports = users;