mongodb 更新文档后,返回旧值

ert*_*akk 5 javascript mongodb node.js promise es6-promise

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

    }
})
Run Code Online (Sandbox Code Playgroud)

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

Allposts 有一个包含 posts 的数组:[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)
Run Code Online (Sandbox Code Playgroud)

反应函数调用:

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

        this.props.deletePost(postinfo)
    }
Run Code Online (Sandbox Code Playgroud)

Ash*_*shh 0

所有 mongo 查询都返回部分承诺。你必须使用.then才能解决每一个承诺。

在这里,您将连续运行所有查询,而不使用.thenasync-await。因此,每当您$pull从此AllPosts之后立即调用AllPosts聚合查询时,该查询有时会被执行,有时则不会。

因此,为了使其逐一运行,您必须使用.thenasync-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" })
          );
      });
  }
})
Run Code Online (Sandbox Code Playgroud)