1

我从这个 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);  
      }
    }  
  }
}
4

2 回答 2

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"
于 2013-10-03T07:36:23.307 回答
0

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

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

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

首先,如果您使用视图,则不应发出密码,而应发出登录名。

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

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

但最后,您实际上根本不应该使用任何视图。你应该做的是让你的文档的关键是用户名(或确定的东西),然后执行一个简单的 GET。

视野很棒,但对你的 CB 来说真的很重。您应该首先尝试查看是否无法对模式进行建模,这样您就不必使用它们,然后,如果卡住了,请创建一个视图。

于 2016-05-11T11:22:50.140 回答