【问题标题】:Querying couchbase by passing some value dynamically通过动态传递一些值来查询沙发库
【发布时间】:2014-12-15 04:27:16
【问题描述】:

我正在以以下格式存储 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”。我尝试了很多,但找不到合适的解决方案。任何人都可以帮助我摆脱这个困境。

提前感谢您的任何建议。

【问题讨论】:

    标签: couchbase couchbase-view


    【解决方案1】:

    我认为实际上你想通过 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 字符,它允许模拟精确的键匹配,因为“myEmail”和“myEmail\uefff”之间没有其他字符组合。

    【讨论】:

    • 非常感谢您的帮助。我很感激。
    • 如果我想获取大于某个值的文档(该值是 Java 中的动态值),我该怎么做?
    • @Sivailango 只需使用startkey(但会大于或等于,按字母顺序排列)
    • 我弄错了,要使用的特殊字符是\uefff(已修复)
    • @Sivailango 您应该在startkey 中设置这两个值,但我认为它也会在国家/地区执行 >= ......在这种情况下,也许使用["us", 28] 作为启动键和例如["us", 999] 作为结束键...
    【解决方案2】:

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

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

    【讨论】:

    • 这确实会更好
    • 建议是好人,但我有另一个逻辑来制作沙发库文档密钥,它是唯一且安全的。 @simon-很抱歉,我没有足够的声誉将您的答案标记为已接受。 :(
    • 那么,如果您要经常访问该电子邮件地址,那么将其拆分为一个单独的密钥可能是值得的。只是想一想。通过键而不是视图访问对象的次数越多,性能就越好。
    • @kirk - 根据我的项目需要,我正在将 UUID 和密钥一起加密以生成 CB 文档。
    猜你喜欢
    • 2021-01-07
    • 2012-12-26
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    相关资源
    最近更新 更多