我从这个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);
}
}
}
}
答案 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来说真的很重要。您应首先尝试查看是否无法对架构建模,以便不必使用它们,然后,如果卡住,则创建一个视图。