如何从一个简单的常见SQL查询转换:将MYSQL查询转换为Couchbase NoSQL?

时间:2013-10-02 01:54:15

标签: php nosql couchbase

我从这个couchbase博客中得到的样本,似乎暗示我需要在nosql中循环搜索,在我看来,在搜索数百万个文档时,这是低效且危险的。我误解了吗?有什么建议吗?

那么如何以正确的方式在couchbase nosql语言中实现呢?

查询示例:

select * from users where loginname='xxx' and passwd='yyy'

Nosql / couchbase示例:

function (doc, meta) {
  if (doc.ingredients) {
    for (i=0; i < doc.user.length; i++)                                                              {                                                                                                         if (doc.user[i].loginname != null)
      {
        emit([doc.user[i].loginname , doc.loginname], null);  
      }
    }  
  }
}

2 个答案:

答案 0 :(得分:1)

在Couchbase 2.x中实现这一目标的一种方法是在索引中发出登录名和密码,并进行精确的密钥搜索。由于我不知道您的JSON文档的结构,我只会考虑用户名和密码是文档的2个属性(doc参数)

function (doc, meta) {
    emit([doc.loginname , doc.password], null);  
}  

然后,您可以使用以下查询搜索文档(我使用REST API,您必须使用您选择的客户端SDK。

?key=["username_to_check","password_to_check"]

注意:请不要犹豫,添加有关文档结构的更多信息,以帮助STOF用户正确回答问题。


开发者预览

如果您是技术早期采用者,我邀请您查看Couchbase正在构建的下一代查询语言: http://www.couchbase.com/communities/n1ql

在这种情况下,查询看起来像

SELECT *
    FROM contact-bucket 
    WHERE loginname = "username"
    AND password = "password"

答案 1 :(得分:0)

我不确定你的例子是真实案例,还是仅仅了解CB是如何工作的。 但我认为你应该尽量避免在这种情况下使用视图。

这似乎是您正在进行的登录搜索。如果这是您查询的目的,您确实可以发出如下的用户名和密码:

function (doc, meta) {
    emit([doc.loginname , doc.password], null);  
} 

首先,如果您使用的是视图,则不应该发出密码,只需要发出登录名。

function (doc, meta) {
    emit([doc.loginname], null);  
}

并在您的应用程序中手动验证密码。

但最后,你根本不应该使用任何视图。 你应该做的是让你的文档的密钥是用户名(或确定性的东西),只需执行一个简单的GET。

查看很棒,但对你的CB来说真的很重要。您应首先尝试查看是否无法对架构建模,以便不必使用它们,然后,如果卡住,则创建一个视图。