【问题标题】:How do I call remove() within mongoose query .find()?如何在 mongoose 查询 .find() 中调用 remove()?
【发布时间】:2019-08-25 17:55:43
【问题描述】:

我正在使用 Mongoose 查询一个名为“orders”的整个 Mongodb 集合。然后我得到订单创建和当前日期之间的天数差异。过了一定天数后,我想从数据库中删除文档(订单)。

我在 for 循环中对订单进行迭代,因此当循环找到具有 x 天数差异的订单时,我只是试图调用“orders[i].remove()”。这是提供的代码块的底部。

我注意到“remove()”方法在 Model.prototye 上,而不是在 Document.prototype 上。但是我看到了其他代码块,建议在“find()”查询中调用“remove()”。

Order.find({},'-_id -line_items -shipping_lines', function(err, orders) {
        if(err) {
            console.log(err);
        }
        for(i = 0; i < orders.length; i++) {
            // Taken from Punit Jajodia https://www.toptal.com/software/definitive-guide-to-datetime-manipulation
            const dateOfOrder = orders[i].date;
            const now = new Date();
            const datefromAPITimeStamp = (new Date(dateOfOrder)).getTime();
            const nowTimeStamp = now.getTime();

            const microSecondsDiff = Math.abs(datefromAPITimeStamp - nowTimeStamp );
            // Number of milliseconds per day =
            //   24 hrs/day * 60 minutes/hour * 60 seconds/minute * 1000 msecs/second
            const daysDiff = Math.floor(microSecondsDiff/(1000 * 60 * 60  * 24));

            console.log(daysDiff);

            // If it is exactly 15 days from the triggering order, post the new order
            if (daysDiff === 15) {

                // ?consumer_key=${process.env.CONS_KEY}&consumer_secret=${process.env.CONS_SEC}

                //console.log(orders[i]);

                axios.post(baseUrl + `/orders?consumer_key=${process.env.CONS_KEY}&consumer_secret=${process.env.CONS_SEC}`, orders[i])
                .then(function (response) {
                    console.log(response.data);

                })
                .catch(function (error) {
                    // handle error
                    console.log(error.response.status);
                    // console.log(error);
                })
                .then(function () {

                });
            }

            if (daysDiff === 0) {
                //Remove orders that are 25 days old from the db
                orders[i].remove(function(err,result) {
                    if(err) {
                        console.log(err);
                    }
                    console.log(result);
                });
            }
        }
    });

我希望当 if 语句为真时删除该文档。但我收到此错误“消息:'No _id found on document!', name:'MongooseError'”我也在查看 mlab 中的订单,它们肯定有一个 '_id'。

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    我猜您的删除查询格式不正确。尝试一次如下:

            if (daysDiff === 0) {
                //Remove orders that are 25 days old from the db
                Order.remove({_id: orders[i]._id },function(err,result) {
                    if(err) {
                        console.log(err);
                    }
                    console.log(result);
                });
            }
    

    例如:remove 订单集合中 _id 字段等于“某物”的特定文档,如下所示。

    db.users.remove( { _id : "something" } )
    

    【讨论】:

    • 我不再收到错误,但它没有删除查询的文档。结果如下:{ n: 0, opTime: { ts: Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1554416643 }, t: 8 }, electionId: 7fffffff0000000000000008, ok: 1, operationTime: Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1554416643 }, '$clusterTime': { clusterTime: Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1554416643 }, signature: { hash: [Binary], keyId: [Long] } }, deletedCount: undefined } 我还尝试了 findOneAndDelete() 以及其他方法
    • 您认为问题可能出在 for 循环中吗?
    • 我不小心遗漏了 .find() 查询中的 _id 字段。 :facepalm: 感谢您的帮助。
    【解决方案2】:

    嗯。这是过去两天最大的脸:

    在我的.find() 查询中,我故意(意外)省略了_id

    Order.find({},'-_id -line_items -shipping_lines', function(err, orders) { ...
    

    这导致 orders[i]._id 在我的 for 循环中未定义。我们为编码而活。

    【讨论】:

    • 为了记录,.remove() 也被折旧了。请改用deleteOne()deleteMany()bulkWrite()
    猜你喜欢
    • 1970-01-01
    • 2017-12-18
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 2018-11-17
    • 2018-05-22
    • 1970-01-01
    相关资源
    最近更新 更多