当试图从以下场景中获得结果时,我对是否使用选择器或视图,或两者都使用感到困惑:
我需要对一本书做一个wildsearch,并返回书的结果加上价格和商店分支名称的详细信息。
所以我试着用selector用regex进行通配符搜索
"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);
所以我想请一位Maven帮忙。
另一个问题是如何获取store_分支_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条答案
按热度按时间fumotvh31#
在Cloudant Query中,您可以指定两种不同的索引,了解这两种索引之间的区别非常重要。
对于你问题的第一部分,如果你使用Cloudant Query的
$regex
操作符进行通配符搜索,你最好创建一个类型为"text"
的Cloudant Query索引,而不是类型为"json"
的Cloudant Query索引。它在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函数):
这里生成的二级索引将利用http://wiki.apache.org/couchdb/View_collation中概述的规则--字符串在数组之前排序,数组在对象之前排序。然后,您可以发出范围查询来模拟使用JOIN得到的结果。
我认为这是尽可能多的细节,这是适当的。希望它有帮助!