【问题标题】:Mongoose finds already deleted documentsMongoose 找到已删除的文档
【发布时间】:2019-01-02 02:20:56
【问题描述】:

我的 api 中有一个端点,它会删除一个特定的文档:

exports.removeProduct = (req, res) => {
    const productId = req.params.productId
    Product.deleteOne({ _id: productId }, (err) => {
        // handle response
    })
}

由于已删除的文档已不在数据库中,因此此时应该已将其删除。 尽管如此,我在调用它时检索了已删除的文档:

exports.getUnpublished = (req, res) => {
    var unpublishedProducts = []
    const userId = req.params.userId
    Product.find({ userId: userId, published: false }, (err, products) => {
        products.forEach((product) => {
            if (Number(product.createdAt) === Number(product.updatedAt)) {
                Product.remove({ _id: product._id }).exec();
            } else {
                unpublishedProducts.push(product)
            }
        })
        // handle response
    })
}

解释:首先,我找到所有具有特定userId 并且还没有published 的文档。之后,我遍历所有找到的文档并删除所有从未更新过的文档。所有其他文档都被推入unpublishedProducts 数组。

奇怪的是,unpublishedProducts 数组包含已被删除的文档。

P.S.:我注意到,重启服务器后,删除的文档不在unpublishedProducts数组中了。

【问题讨论】:

    标签: node.js database mongodb express mongoose


    【解决方案1】:

    您可以通过添加 deleted: {type: Boolean, default: false} 属性来更新您的产品架构。

    removeProduct你可以使用

    Product.updateOne({ _id: productId }, {$set: {deleted: true}}, (result) => {
            // handle response
    })
    

    要检索所有未删除的产品,您可以使用此查询Product.find({deleted: {$ne: true}})

    【讨论】:

    • 谢谢,这确实是个好主意,但是你知道问题出在哪里吗?
    • unpublishedProducts 是一个内存变量,重启服务器后会被销毁。因此您需要通过为 unpublishedProducts 添加新集合或使用 Redis DB 将 unpublishedProducts 保存在某处。
    • 非常感谢!每次路由被触发时,我都做了unpublishedProducts = []
    猜你喜欢
    • 2018-05-07
    • 2020-01-04
    • 2020-01-31
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    相关资源
    最近更新 更多