我想在我的 MongoDB 中做一个插入,但它变得非常复杂,而且这是一个简单的操作,所以我想我在某个时候迷路了。
我有三个集合,为了这个问题我将对其进行简化:站点、客户端、黑名单。
当新客户注册时,她会立即获得一个站点。因此我需要从表单中检查,如果客户端不存在,那么如果客户端电子邮件没有被列入黑名单,那么如果站点不存在,最后创建元素客户端和站点。
我开始通过回调来做到这一点,但这样做对我来说似乎过于复杂了:
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");
}
最佳答案
Node 编程与顺序编程有很大不同。
你可以使用 async或另一个顺序抽象库,例如序列
。
如果您不害怕深入研究,您可以启用“Harmony”(并使用 Node.js 的尖端版本)并使用 Generators 和 Promises。有了它,就可以编写看起来像顺序代码的代码。
但目前看来您最好还是使用 async
。习惯它需要一点时间,但过了一段时间后,您就可以不假思索地阅读和编写代码。
在您的特殊情况下,另一种解决此问题的方法是完全更改您的数据库架构。为什么不只有一个 Clients
和 Blacklists
集合,并将 Sites
集合的内容作为嵌入式文档直接移动到客户端?当然,这在很大程度上取决于您的用例,通常不能被视为更好的解决方案。
关于javascript - 带有 Node.js 数据库查询的 MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20657662/