灾难性的MongoDB + Mongoose生产数据丢失

时间:2017-06-04 11:34:00

标签: javascript node.js mongodb mongoose

我在生产中运行MongoDB。今天我醒来了我的一个完全删除的生产文件集合。幸运的是我备份了数据,这不是一个庞大的项目,但对我来说,原因仍然是个谜。

代码运行正常6个月,没有任何问题。今天上午10点,我的一个系列中的所有内容都被删除了。

这是日志中的条目。我正在用“myDB”和“cars”替换db名称和集合名称。

2017-06-04T10:46:43.412+0200 I COMMAND  [conn203614] command myDB.$cmd command: delete { delete: "cars", deletes: [ { q: {}, limit: 0 } ], ordered: true, writeConcern: { w: 1 } } keyUpdates:0 writeConflicts:0 numYields:0 reslen:40 locks:{ Global: { acquireCount: { r: 26393, w: 26393 } }, Database: { acquireCount: { w: 26393 } }, Collection: { acquireCount: { w: 26393 } } } protocol:op_query 52921ms

起初我实际上认为数据库可能已被攻击,因为

delete { delete: "cars", deletes: [ { q: {}, limit: 0 } ] }

对我来说,看起来很残酷。我的代码中没有运行delete {}的地方。 但现在我查看了所有内容,并且有一个特定的实例,我将删除集合中适合某个查询(属于用户)的所有“汽车”。我认为这可能是错误发生的地方,但我无法理解。这是有问题的代码。我已在此示例中更改了“user.find”的查询,但我向您保证它并不复杂。

models.user.find(   { something: "cool"}, '_id', function(err,result)
{

    result.forEach(function(user) {

        models.car.remove({owner:user._id},function(err){if(err) console.log(err)})

    })

});

所以,基本上,我认为引起这个问题的重要路线是:

models.car.remove({owner:user._id}, ... )

直到今天,这已经运行了几个月并且从未失败过。我的第一个怀疑显然是用户对象有问题,例如user.id未定义。所以我测试:

models.car.remove({owner:undefined}, ... )

它不会删除任何内容,也不会引发错误。 HOWEVER 显然,当我跑

models.car.remove({}, ... )

它删除了集合的内容。它还会在日志中生成完全相同的条目,这就是我认为此代码导致错误的原因。某些内容必须影响{owner:user._id}才能转换为等效的{}。

我只是不明白怎么做。真的希望快速解决这个问题,感谢任何帮助。

0 个答案:

没有答案