javascript - 带有 Node.js 数据库查询的 MongoDB

标签 javascript node.js mongodb

我想在我的 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。习惯它需要一点时间,但过了一段时间后,您就可以不假思索地阅读和编写代码。

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

关于javascript - 带有 Node.js 数据库查询的 MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20657662/

相关文章:

node.js - 将 MongoDB 与 Node.js 一起使用的最佳方式?

javascript - 单击时如何一个接一个展开和折叠div

javascript - 来自 Android 和 IOS 客户端的 Ratchet 套接字

mongodb - mongo - 无法连接到服务器 127.0.0.1 :27017

sockets - 如何通过 net.socket 或 http.request 创建 HTTP-1.0 请求?

node.js - 语法错误 : Unexpected token import - import * as gulp from 'gulp'

node.js - Mongoose 中的聚合管道运算符

javascript - 为什么 AJAX 会破坏插件?

javascript - 将依赖对象传递给 Javascript 模块时遇到问题

javascript - 返回顺序运行的子进程的 promise