我应该在Cloudant中使用选择器还是视图?

时间:2016-03-28 10:06:38

标签: ibm-cloud cloudant

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

我需要对一本书进行野生搜索并返回书籍的结果以及商店分支名称的价格和详细信息。

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

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

我能够得到结果。获得结果后的想法是使用结果集中的所有_id&s查询到视图以获取更多细节,例如价格和商店分支名称在其他文档上,我觉得这有点奇怪而且我'我不确定这是正确的做法。

一旦我得到_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...**

    }
  ]
}

1 个答案:

答案 0 :(得分:2)

在Cloudant Query中,您可以指定两种不同类型的索引,了解两者之间的差异非常重要。

对于问题的第一部分,如果您使用Cloudant Query的$regex运算符进行通配符搜索,那么最好创建类型为{{{{{{{$的Cloudant查询索引)。 1}}而不是类型"text"。它位于Cloudant文档中,但请参阅介绍博客文章了解详细信息:https://cloudant.com/blog/cloudant-query-grows-up-to-handle-ad-hoc-queries/此处有更高级的帖子,涵盖了两种索引https://cloudant.com/blog/mango-json-vs-text-indexes/ <之间的权衡/ p>

如果不了解应用程序如何与您的数据进行交互,那么解决问题的第二部分会更加困难,但有一些建议。

1)考虑对某些信息进行非规范化处理,以便您不会开始使用JOIN。

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

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

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

"json"

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

我认为这里的细节非常合适。希望它有所帮助!