【问题标题】:Mongoose $pull operator not removing ObjectID from arrayMongoose $pull 运算符未从数组中删除 ObjectID
【发布时间】:2021-02-08 01:34:39
【问题描述】:

在我的应用程序中,我有一个发布模式(如下所示):

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
    }]
})

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

路线:

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')

但是,当调用路由时,objectid 不会从数组中删除。谁能发现为什么?谢谢。

更新:

const user = mongoose.Types.ObjectId(req.user._id)

更新 2:

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

【问题讨论】:

  • 尝试使用mongoose.Types.ObjectId(req.user._id)将_id转换为对象id
  • @turivishal 你好。这仍然没有从 likes 数组中删除对象 id。请参阅上面的更新代码。
  • 你正在对查找对象进行更新操作,只需单独查询await Post.update({}, { $pull: { likes: mongoose.Types.ObjectId(req.user._id) } })
  • @turivishal 嗨,这仍然没有奏效。请检查上面的更新代码
  • 在查询前输入await,不需要post.save() 命令,因为updateOne 将保存事务,如果仍然无效,请尝试转换您的查询{_id: mongoose.Types.ObjectId(req.params.postid)}

标签: javascript node.js mongoose mongoose-schema


【解决方案1】:

您可以在一个查询中完成这两项操作,无需findOne

  • 使用mongoose.Types.ObjectIdreq.user._id 转换为对象ID
  • $inc 规定likeNum 的计数
await Post.updateOne(
  { _id:  req.params.postid },
  {
    $pull: { likes: mongoose.Types.ObjectId(req.user._id) },
    $inc: { likeNum: -1 }
  }
);
res.send('Unliked');

Playground

【讨论】:

    猜你喜欢
    • 2021-04-01
    • 2021-08-11
    • 2016-10-04
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 2018-08-13
    • 2016-05-09
    • 2018-08-05
    相关资源
    最近更新 更多