【问题标题】:mongodb after updating document, returns old valuesmongodb 更新文档后,返回旧值
【发布时间】:2020-05-06 11:18:00
【问题描述】:
router.delete('/deletepost', (req, res) => {
    // console.log(req.query.postid)
    if (req.query.category === 'forsale') {
        ForSalePosts.findById(req.query.postid)
            // .then(post => console.log(post))
            .deleteOne()
            .catch(err => console.log(err))

        AllPosts.updateOne({ user: req.query.userid },
            { $pull: { posts: { postid: req.query.postid } } })
            .catch(err => console.log(err))
            AllPosts.aggregate(
                [

                    { $match: { user: ObjectId(req.query.userid) } },
                    { $unwind: '$posts' },
                    { $sort: { 'posts.date': -1 } }

                ]
            )
                .then(posts => {
                    // console.log(posts)
                    res.json(posts)
                })
                .catch(err => res.status(404).json({ nopostfound: 'There is no posts' }))

    }
})

这是我的路线。我正在尝试删除文档中的一个项目。该项目正在被删除,但它返回旧值。例如:

Allposts 有一个包含帖子的数组:[postid:{type:String}, ...] 我正在尝试使用 $pull 删除特定的 postid, postid 正在被删除,但是当我聚合相同的模型时, .then(posts=> console.log(posts)) 在第一次调用时返回旧值,不会更新组件。

编辑:刚刚意识到有时它会返回正确的值,但有时它也会返回旧值。有谁知道为什么以及我能做些什么来解决它?

const mongoose = require('mongoose')
const Schema = mongoose.Schema;

const AllPostsSchema = new Schema({
    user: {
        type: Schema.Types.ObjectId,
        ref: 'users'
    },
    posts: [{
        postid: {
            type: String
        },
        title: {
            type: String
        },
        category: {
            type: String
        },
        subcategory: {
            type: String
        }, category: {
            type: String
        },
        description: {
            type: String
        },
        name: {
            type: String
        },
        price: {
            type: Number
        },
        email: {
            type: String
        },
        phonenumber: {
            type: Number
        },
        language: {
            type: String
        },
        make: {
            type: String
        },
        model: {
            type: Number
        },
        odometer: {
            type: Number
        },
        condition: {
            type: String
        },
        state: {
            type: String
        },
        town: {
            type: String
        },
        city: {
            type: String
        },
        links: [{ type: String }],

        date: {
            type: Date,
            default: Date.now
        }
    }]

})


module.exports = AllPosts = mongoose.model('allposts', AllPostsSchema)

反应函数调用:

  deletePost = (category, postid) => {
        const postinfo = {
            category: category.toLowerCase(),
            postid: postid,
            userid: this.props.auth.user.id
        }

        this.props.deletePost(postinfo)
    }

【问题讨论】:

    标签: javascript node.js mongodb promise es6-promise


    【解决方案1】:

    所有 mongo 查询都返回部分承诺。您必须使用 .then 来解决每个承诺。

    在这里,您在不使用.then 或async-await 的情况下连续运行所有查询。因此,每当您从AllPosts $pull 之后立即调用AllPosts 聚合查询,该查询有时会被执行,有时不会。

    因此,为了使其一个一个运行,您必须使用.then 或async-await。

    router.delete("/deletepost", (req, res) => {
      if (req.query.category === "forsale") {
        ForSalePosts.findById(req.query.postid)
          .deleteOne()
          .then(() => {
            AllPosts.updateOne(
              { "user": req.query.userid },
              { "$pull": { "posts": { "postid": req.query.postid } } }
            )
              .then(() => {
                AllPosts.aggregate([
                  { "$match": { "user": ObjectId(req.query.userid) } },
                  { "$unwind": "$posts" },
                  { "$sort": { "posts.date": -1 } }
                ]).then(posts => {
                  // console.log(posts)
                  res.json(posts);
                });
              })
              .catch(err =>
                res.status(404).json({ "nopostfound": "There is no posts" })
              );
          });
      }
    })
    

    【讨论】:

      【解决方案2】:

      您需要在delete 中添加options 参数,如:

      AllPosts.updateOne({ user: req.query.userid }, 
          { 
           $pull: { posts: { postid: req.query.postid } } 
          }, 
          { new: true }
      );
      

      这将在执行操作后返回新对象。希望这对你有用。

      【讨论】:

        猜你喜欢
        • 2014-09-04
        • 1970-01-01
        • 2020-04-10
        • 1970-01-01
        • 1970-01-01
        • 2017-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多