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

np8igboo  于 2022-12-09  发布在  CouchDB
关注(0)|答案(1)|浏览(168)

当试图从以下场景中获得结果时,我对是否使用选择器或视图,或两者都使用感到困惑:
我需要对一本书做一个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...**

    }
  ]
}
fumotvh3

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函数):

'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得到的结果。
我认为这是尽可能多的细节,这是适当的。希望它有帮助!

相关问题