【问题标题】:couchDB- complex query on a viewcouchDB - 视图上的复杂查询
【发布时间】:2016-09-22 12:21:57
【问题描述】:

我正在使用 cloudantDB 并想查询一个看起来像这样的视图

function (doc) { if(doc.name !== undefined){ emit([doc.name, doc.age], doc); }

如果我有一个名称列表(我将为此使用选项'keys = []')和一个年龄范围(应该使用startkey和endkey),那么获得结果的正确方法应该是什么

示例:我想找到姓名为“john”或“mark”或“joseph”或“santosh”且年龄限制在 20 到 30 岁之间的人。

如果我查询姓名列表,查询应该是 keys=["john", ....] 如果我去查询年龄应该使用 startkey 和 endkey

我都想做:)

谢谢

【问题讨论】:

    标签: view mapreduce couchdb cloudant nosql


    【解决方案1】:

    很遗憾,您不能这样做。使用 keys 参数查询具有指定键的文档。例如,您不能只发送 keys=["John","Mark"]&startkey=[null,20]&endkey=[{},30]。此查询只会ONLY返回名称为JohnMark且年龄为空的文档。

    在您的问题中,您指定了 CouchDB,但如果您使用的是 Cloudant,index query 可能对您来说很有趣。

    你可以有类似的东西:

    {
      "selector": {
        "$and": [
          {
            "name": {
               "$in":["Mark","John"]
             }
          },
          {
            "year": {
              "$gt": 20,
              "$lt": 30
            }
          }
        ]
      },
      "fields": [
        "name",
        "age"
      ]
    }
    

    对于 CouchDB,您需要分开您的请求(1 个年龄请求和 1 个人员请求),或者您在本地进行过滤。

    【讨论】:

    • 嗨,亚历克西斯,感谢您的回复。我正在使用 cloudant,但这篇文章说索引有 200 个限制,然后它会发送剩余的书签。 ibm.com/developerworks/cloud/library/…我的数据库中有近 10 万个文档
    • 它的请求限制为 200 个文档,而不是整个数据库。这意味着如果您要查询总共 400 个文档,则需要 2 个请求。
    • 是的,你是对的。就我而言,我有 100k 文档。即使有一半满足查询,我也将不得不提出太多请求
    • 在这种情况下,使用年龄范围进行过滤将是最有效的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2012-07-08
    相关资源
    最近更新 更多