2016-03-28 61 views
0

我试图从下面的场景中得到结果时是否对使用选择符或视图或两者都有困惑:我应该在Cloudant中使用选择器还是视图?

我需要为书进行wildsearch并返回书的结果加上价格和商店分店名称的详细信息。

所以我试着用选择做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...** 

    } 
    ] 
} 

回答

2

在Cloudant查询,您可以指定两种不同的指标,要知道两者之间的区别是很重要的。

对于你的问题的第一部分,如果你使用Cloudant查询的$regex运营商通配符搜索这样的,你可能会更好创造的,而不是"json""text"类型的Cloudant查询索引。它在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 View索引系统发出复合键(数组),您可以利用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获得的结果。

我认为这是适合这里的细节。希望能帮助到你!

+0

非常感谢你的回答,并且很抱歉现在就回复,可能我对于我在解释中想要做的事情并不十分清楚。总之,我只想列出商店分店和价格的书籍清单。与上面给出的文件。我实际上已经通过将商店和商店分支合并为1个文档来非规范化。但其余的我不认为我可以再次正常化它。 – kkurni

+0

关于第二个问题,我实际上很难在单个查询中引用商店分支标识。 我的“关系”文档有product_id,store_branch_id和价格。问题是我不知道如何在Store文档中引用store_branch_id和branch []。branch_id,因为它是一个嵌套对象 – kkurni

相关问题