MongoDB与Node.js数据库查询

我想在我的MongoDB中插入一个插入,但是它变得相当复杂,而且这是一个简单的操作,所以我觉得我在某个时候丢了。

我有三个集合,我会简化为了这个问题:网站,客户,黑名单。

当新客户注册时,她立即得到一个网站。 因此,我需要从表单中检查,如果客户端不存在,那么如果客户端电子邮件没有被列入黑名单,那么如果该站点不存在,最后创build客户端和站点元素。

我开始通过callback来做到这一点,但似乎这样做是过度的妥协:

var input = {...}; //assume here I have all the user input db.collection('Clients').count({'email', input.email}, {limit: 1}, function (err, count) { if (count > 0) { db.collection('Blacklist').count({'email', input.email}, {limit: 1}, function (err, count) { if (count > 0) { db.collection('Sites').count({'domain', input.domain}, {limit: 1}, function (err, count) { if (count > 0) { // CREATE THE ACCOUNT } else { res.send("Site already exists."); } db.close(); }); } else { res.send("Client is blacklisted."); } db.close(); }); } else { res.send("Client already exists."); } db.close(); }); 

任何其他方式来轻松实现这种操作?

理想对我来说是这样的:

 var input = {...}; //assume here I have all the user input if ( db.collection('Clients').count({'email', input.email}, {limit: 1}) == 0 && db.collection('Blacklist').count({'email', input.email}, {limit: 1}) == 0 && db.collection('Sites').count({'domain', input.domain}, {limit: 1}) == 0 ) { // INSERT HERE } else { res.send("Could not insert"); } 

你可以使用asynchronous 。 喜欢这个:

 var input = {...}; //assume here I have all the user input var validate = function (input, callback) { async.parallel({ clientExists: function(cb) { db.collection('Clients').count({'email', input.email}, {limit: 1}, cb) }, blacklisted: function(cb) { db.collection('Blacklist').count({'email', input.email}, {limit: 1}, cb) }, siteExists: function(cb) { db.collection('Sites').count({'domain', input.domain}, {limit: 1}, cb) }, }, function(error, result) { db.close(); if (error) { return callback({ message: 'Server error', error: error }); } if (result.clientExists > 0) { return callback({ message: 'Client already exists', }); } if (result.siteExists > 0) { return callback({ message: 'Site already exists', }); } if (result.blacklisted > 0) { return callback({ message: 'Client is blacklisted', }); } callback(null, true) }) } validate(input, function (error, success) { if (error) { return res.send(error.message) } //CREATE ACCOUNT HERE! }) 

节点编程与顺序编程非常不同。

你可以使用asynchronous或其他顺序抽象库,如Seq

如果您不怕深潜,您可以启用“和谐”(并使用Node.js的尖端版本),并与Generators and Promises一起工作。 有了这个可以编写看起来像顺序代码的代码。

但是现在看来,你最好使用async 。 需要一点时间才能习惯它,但过了一段时间,你就不需要太多思考就可以读写代码。

而在你的特殊情况下解决这个问题的另一种方法是完全改变你的数据库模式。 为什么不只有ClientsBlacklists集合,并将Sites集的内容直接作为embedded式文档移动到客户端? 当然,这很大程度上取决于您的使用情况,通常不能被视为更好的解决scheme。