【问题标题】:Should I use selector or views in Cloudant?我应该在 Cloudant 中使用选择器还是视图?
【发布时间】:2016-03-28 10:06:38
【问题描述】:

在尝试从以下场景中获取结果时,我对是否使用选择器或视图或两者都使用感到困惑:

我需要搜索一本书并返回书籍的结果加上价格和分店名称的详细信息。

所以我尝试使用选择器使用正则表达式进行 Wildsearch

"selector": {
              "_id": {
                "$gt": null
              },
              "type":"product",
              "product_name": {
                "$regex":"(?i)"+search
              }
            },
            "fields": [
              "_id",
              "_rev",
              "product_name"
           ]

我能够得到结果。得到结果后的想法是使用结果集和查询中的所有 _id 来获取更多详细信息,例如价格和在其他文档上存储分支名称,我觉得这有点奇怪,我不确定是不是正确的做法。

下面是我得到 _id 的结果并将其作为“productId”变量插入后的想法。

  var input = {
        method : 'GET',
        returnedContentType : 'json',
        path : 'test/_design/app/_view/find_price'+"?keys=[\""+productId+"\"]",      

              };
              return WL.Server.invokeHttp(input);

所以我想征求专家的意见。

另一个问题是如何获取store_branch_name?是否可以在一个视图中完成,我们可以在其中获取产品详细信息、价格和商店分店名称?或者我需要有几个视图来实现这一点?

预期结果

product_name (from book document) :   Book 1 
branch_name  (from branch array in Store document) : store 1 branch one    
price ( from relationship document) : 79.9

参考资料:

  "_id": "book1",
  "_rev": "1...b",
  "product_name": "Book 1",
  "type": "book"

  "_id": "book2",
  "_rev": "1...b",
  "product_name": "Book 2 etc",
  "type": "book"

关系

  "_id": "c...5",
  "_rev": "3...",
  "type": "relationship",
  "product_id": "book1",
  "store_branch_id": "Store1_branch1",
  "price": "79.9"

商店

{
  "_id": "store1",
  "_rev": "1...2",
  "store_name": "Store 1 Name",
  "type": "stores",
  "branch": [
    {
      "branch_id": "store1_branch1",
      "branch_name": "store 1 branch one",
      "address": {
        "street": "some address",
        "postalcode": "33490",
        "type": "addresses"
      },
      "geolocation": {
        "coordinates": [
          42.34493,
          -71.093232
        ],
        "type": "point"
      },
      "type": "storebranch"
    },
    {
      "branch_id": "store1_branch2",
      "branch_name": 
        **details ommit...**

    }
  ]
}

【问题讨论】:

    标签: ibm-cloud couchdb cloudant couchdb-mango


    【解决方案1】:

    在 Cloudant Query 中,您可以指定两种不同类型的索引,了解两者之间的区别很重要。

    对于问题的第一部分,如果您使用 Cloudant Query 的 $regex 运算符进行类似的通配符搜索,则最好创建 "text" 类型的 Cloudant Query 索引而不是 "json" 类型。它在 Cloudant 文档中,但有关详细信息,请参阅介绍性博客文章:https://cloudant.com/blog/cloudant-query-grows-up-to-handle-ad-hoc-queries/ 有一篇更高级的文章介绍了这两种索引之间的权衡https://cloudant.com/blog/mango-json-vs-text-indexes/

    如果不了解您的应用程序如何与您的数据交互,就很难解决您问题的第二部分,但有几条建议。

    1) 考虑对其中的一些信息进行非规范化处理,这样一开始就不用进行 JOIN。

    2) 在文档键中注入更多逻辑,并使用传统 MapReduce 视图索引系统发出复合键(数组),您可以利用 CouchDB/Cloudant 索引排序规则来模拟 JOIN .

    第二个是满口的,但请在 YouTube 上查看此示例:https://youtu.be/0al1KnCKjlA?t=23m39s

    这是我正在谈论的内容的预览(示例地图功能):

    'map' : function(doc)
        {
            if (doc.type==="user") {
                    emit( [doc._id], null );
            }
            else if (doc.type==="edge:follower") {
                emit( [doc.user, doc.follows], {"_id":doc.follows} );
            }
        }
    

    此处生成的二级索引将利用http://wiki.apache.org/couchdb/View_collation 中概述的规则——字符串在数组之前排序,数组在对象之前排序。然后,您可以发出范围查询来模拟通过 JOIN 获得的结果。

    我认为这里的细节很合适。希望对您有所帮助!

    【讨论】:

    • 感谢您的回答,很抱歉现在才回复,可能我不太清楚我在解释中要做什么。总而言之,我只想列出带有分店和价格的书籍清单。与上面给出的文件。实际上,我已经通过将 store 和 store 分支组合成 1 个文档来对它们进行非规范化。但其余的我认为我不能再次对其进行非规范化。
    • 关于第二个问题,我实际上很难在单个查询中引用商店分支 id。我的“关系”文档包含 product_id、store_branch_id 和 price。问题是我不知道如何在 Store 文档中使用 branch[].branch_id 引用 store_branch_id,因为它是一个嵌套对象
    猜你喜欢
    • 2016-04-28
    • 2011-01-25
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 2019-12-04
    • 2011-10-21
    • 1970-01-01
    相关资源
    最近更新 更多