通过动态传递一些值来查询couchbase

时间:2014-12-15 04:27:17

标签: couchbase couchbase-view

我正在使用以下格式存储的couchbase文档:

{
"userEmail": "satyam@xyz.com",
"hashedPassword": "$2a$12$MT31FHNEbOAKpQGzLdBB3uhLlPlGNU0cvsgi/2pt4TdwPjvrUzkSG",
"type": "user",
}

我只想阅读 userEmail 值为 satyam@xyz.com 的文档。为此我写了一个沙发基地视图:

function (doc, meta) {
  if(doc.userEmail == "satyam@xyz.com")
      emit(doc.data, meta.id);
}

现在我想要的是,我想传递价值" satyam@xyz.com"来自Java代码。我尝试了很多,但无法找到合适的解决方案。任何人都可以帮助我摆脱这种困境。

提前感谢任何建议。

2 个答案:

答案 0 :(得分:7)

我认为你实际上想要通过userEmail映射你的JSON文档,所以你的map函数应该是这样的:

function(doc, meta) {
    //maybe check the type of the document here, see meta.type
    emit(doc.userEmail, null)
}

两个注释:

  • 如果您的存储桶中同时包含json和非json文档,则只需选中meta.type == "json"即可映射json文档。
  • 结果索引将始终具有文档的ID,因为它不必要地增加索引大小,所以不需要发出它(或整个文档)。

现在您可以通过传递startkeyendkey参数来查询视图,只需一点技巧:

?startkey="theEmail"&endkey="theEmail\uefff"

这里\uefff是第一个unicode char,它允许模拟精确的密钥匹配,因为" myEmail"之间没有其他字符组合。和" myEmail \ uefff"。

答案 1 :(得分:3)

这是给你的问题。如果你有电子邮件地址和电子邮件地址是唯一的,或者你可以使用像userID这样的东西,那为什么不把它作为对象的关键?那你根本就没有视野。您的应用知道它需要什么,并按键获取对象。与使用视图相比,这总是更快更好。需要考虑的事情。

在Couchbase中,你有两个256字节(iirc)的密钥,所以让密钥对你的应用程序有意义并且可能不考虑那个视图?