4

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

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

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

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

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

提前感谢您的任何建议。

4

2 回答 2

7

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

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

两个注意事项:

  • 如果您的存储桶中有 json 和非 json 文档,您可以通过检查仅映射 json 文档meta.type == "json"
  • 结果索引将始终具有文档的 ID,无需发出它(或整个文档),因为它不必要地增加了索引大小。

startkey现在你可以通过传递和参数来查询视图endkey,有一个小技巧:

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

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

于 2014-12-15T08:44:37.070 回答
3

这是一个问题。如果您有电子邮件地址并且电子邮件地址是唯一的,或者您可以让用户 ID 之类的东西是唯一的,那么为什么不将其设为对象的键呢?那么你根本不必有一个观点。您的应用程序知道它需要什么并通过密钥获取对象。这总是比使用视图更快、更可取。只是需要考虑的事情。

在 Couchbase 中,您有 256 字节 (iirc) 的密钥,所以让密钥对您的应用程序有意义,并取消该视图?

于 2014-12-15T16:48:40.323 回答