我刚开始使用MongoDB(或与此相关的任何其他数据库),但是我的费用管理器网络应用程序中存在一个错误。
我有一些用户可以删除的集合(不是 MongoDB集合,这就是我在网站上所说的那样)。从数据库中删除一个集合(以及对该集合的所有引用)后,我将获取所有其他集合。
问题在于,在应该删除的集合被删除之前,服务器已经在获取集合。
这是我尝试删除集合时在终端上显示的内容:
Mongoose: collections.findOne({ _id: ObjectId("5b3f5dc890a1702e96a8f59a") }, { fields: {} })
Mongoose: collections.findOne({ _id: ObjectId("5b3f5dc890a1702e96a8f59a") }, { fields: {} })
Mongoose: users.findOne({ _id: ObjectId("5b321af4b654523b93164187") }, { fields: {} })
Mongoose: collections.find({ user: ObjectId("5b321af4b654523b93164187") }, { fields: {} })
Mongoose: expenses.remove({ _collection: ObjectId("5b3f5dc890a1702e96a8f59a") }, {})
Mongoose: users.updateOne({ _id: ObjectId("5b321af4b654523b93164187") }, { '$pullAll': { collections: [ ObjectId("5b3f5dc890a1702e96a8f59a") ] }, '$inc': { __v: 1 } })
Mongoose: collections.remove({ _id: ObjectId("5b3f5dc890a1702e96a8f59a") }, {})
我试图研究如何等待挂钩完成,但找不到任何东西。我什至不知道对我来说这是否是正确的选择,所以我想我应该在这里问。
这是我的钩子:
collectionSchema.pre('remove', async function(next) {
try {
let user = await User.findById(this.user);
user.collections.remove(this.id);
this.model('Expense').remove({ _collection: this.id }, next);
await user.save();
return next();
} catch(err) {
return next(err);
}
});
答案 0 :(得分:2)
remove(...)
的诺言在async
函数中未正确链接。另一个问题是async
函数返回一个promise,而next
至少在Mongoose 5中对于promises是多余的。
应该是这样的:
collectionSchema.pre('remove', async function() {
let user = await User.findById(this.user);
await user.collections.remove(this.id);
await this.model('Expense').remove({ _collection: this.id });
await user.save();
});
答案 1 :(得分:1)
事实证明,问题出在我用来删除集合的函数上。
显然我在使用一些我不理解的voo-doo魔术代码。 @estus的回答使我再次查看了我的代码,并研究了删除文档的正确方法:
await db.Collection.findByIdAndRemove(req.params.collection_id);
谢谢!