Node.js 如何从users集合中删除孤立的objectid引用?

Node.js 如何从users集合中删除孤立的objectid引用?,node.js,mongodb,express,objectid,Node.js,Mongodb,Express,Objectid,用于查找用户的控制器功能: router.get(“/:id”,userscoontroller.getUser) getUser:async(请求、恢复、下一步)=>{ 试一试{ const user=wait user.findById(req.params.id) 如果(!用户){ 返回res.status(404.json)({message:“User not found”}) } 返回res.status(200).json({user}) }捕获(错误){ 返回下一个(错误) }

用于查找用户的控制器功能:

router.get(“/:id”,userscoontroller.getUser)

getUser:async(请求、恢复、下一步)=>{
试一试{
const user=wait user.findById(req.params.id)
如果(!用户){
返回res.status(404.json)({message:“User not found”})
}
返回res.status(200).json({user})
}捕获(错误){
返回下一个(错误)
}
}
我得到的回答是:

{
“用户”:[
{
“员额”:[
“5e857785591a6c1047341c60”,
“5e85779f591a6c1047341c61”
],
“_id”:“5e84e15ef2ae067df522c164”,
“用户名”:“瑞克”,
“电子邮件”:rickk3@gmail.com",
“密码”:“$2b$10$FRHysk3eBMEOfS3FAT1nEe9voFH9yETR.3V1ZTJkg8Ekwtt6TlJ.W”,
“createdAt”:“2020-04-01T18:45:50.029Z”,
“更新日期”:“2020-04-02T05:26:55.722Z”,
“_v”:9
}
]
}
router.delete(“/:id/delete”,postsController.deletePost)

删除post控制器功能:

deletePost:async(请求、恢复、下一步)=>{
试一试{
const post=wait post.findByIdAndDelete(req.params.id)
如果(!post){
返回res.status(200).json({error:“找不到post”})
}
res.status(200).json({post})
}捕获(错误){
console.log(错误)
}
}
localhost:3000/api/v1/posts/5e857785591a6c1047341c60/delete

删除帖子后,我得到以下回复:

{
“职务”:{
“_id”:“5e857785591a6c1047341c60”,
“头衔”:“你好”,
“描述”:“你好”,
“用户”:“5e84e15ef2ae067df522c164”,
“createdAt”:“2020-04-02T05:26:29.637Z”,
“更新日期”:“2020-04-02T05:26:29.637Z”,
“_v”:0
}
}
现在,在我删除一篇文章之后,我想删除该文章在
users
集合中的
ObjectID
引用

现在,在数据库中,用户文档如下所示:

{
“_id”:ObjectId(“5e84e15ef2ae067df522c164”),
“员额”:
[
ObjectId(“5e857785591a6c1047341c60”),
ObjectId(“5e85779f591a6c1047341c61”)
],
“用户名”:“瑞克”,
“电子邮件”:rickk3@gmail.com",
“密码”:“$2b$10$FRHysk3eBMEOfS3FAT1nEe9voFH9yETR.3V1ZTJkg8Ekwtt6TlJ.W”,
“createdAt”:ISODate(“2020-04-01T18:45:50.029Z”),
“更新日期”: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);
  }
};
易用猫鼬

../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;

因此,当您删除帖子成功后,您可以在内部调用
用户
集合,从
帖子
数组中提取
\u id
元素,尝试以下操作:()记住转换delete post响应中返回的
\u id
为字符串,因此将其转换为
ObjectId()
&通过使用
$in
检查存在此集合的用户文档,从
帖子
用户数组中提取。试试看,如果有任何问题,请告诉我..User.update({u id:post.User},{$pull:{'User.posts':{'我应该在这里做什么'}});它在
mongoose.Types.ObjectId(post.\u id)
@ubuntu7788中给了我一个语法错误。这是什么?修复了错误,但删除post后ObjectId仍然存在,并在控制台中给我一个警告
(节点:6168)弃用警告:collection.update已弃用。改用updateOne、updateMany或bulkWrite。
@ubuntu7788:Use
updateOne
,您是否检查了query
{$pull:{“posts”:mongoose.Types.ObjectId(post.\u id)}
?@ubuntu7788:
posts
是一个字段,但不是必须使用的嵌套字段
user.posts
,如果您喜欢:
用户:{posts:[]
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;