Mongoose $pull 运算符未从数组中删除 ObjectID

ewe*_*eee 3 javascript mongoose node.js mongoose-schema

在我的应用程序中,我有一个帖子架构(如下所示):

const postSchema = new mongoose.Schema({
    file: {
        type: String,
        required: true
    },
    caption: {
        type: String,
        maxLength: 2000 
    },
    user: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    },
    likeNum: {
        type: Number,
        default: 0,
        min: 0
    },
    likes: [{
        type: mongoose.Schema.Types.ObjectId
    }]
})
Run Code Online (Sandbox Code Playgroud)

objectid我想在发送用户请求时从 Like 数组中删除 an 。

路线:

const post = await Post.findOne({_id: req.params.postid})
const user = req.user._id

post.update({}, {$pull: {likes: user}})
post.likeNum--
await post.save()
res.send('Unliked')
Run Code Online (Sandbox Code Playgroud)

然而,objectid当调用路由时, 不会从数组中删除。有人能看出为什么吗?谢谢。

更新:

const user = mongoose.Types.ObjectId(req.user._id)
Run Code Online (Sandbox Code Playgroud)

更新2:

Post.updateOne({_id: req.params.postid}, { $pull: { likes: mongoose.Types.ObjectId(req.user._id) } })
post.likeNum--
await post.save()
res.send('Unliked')
Run Code Online (Sandbox Code Playgroud)

tur*_*hal 5

您可以在单个查询中执行这两项操作,无需这样做findOne

  • 使用转换req.user._id为对象 IDmongoose.Types.ObjectId
  • $inc法令计数likeNum
await Post.updateOne(
  { _id:  req.params.postid },
  {
    $pull: { likes: mongoose.Types.ObjectId(req.user._id) },
    $inc: { likeNum: -1 }
  }
);
res.send('Unliked');
Run Code Online (Sandbox Code Playgroud)

操场