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

Ibm cloud 我应该在Cloudant中使用选择器还是视图?,ibm-cloud,couchdb,cloudant,couchdb-mango,Ibm Cloud,Couchdb,Cloudant,Couchdb Mango,在尝试从以下场景获取结果时,我对是否使用选择器或视图,或两者都使用感到困惑: 我需要对一本书进行一次野外搜索,并返回图书的结果,加上价格和分店名称的详细信息 所以我尝试使用选择器使用正则表达式进行wildsearch 我能得到结果。得到结果后的想法是使用结果集和查询到视图中的所有_id来获取更多细节,如其他文档上的价格和门店名称,我觉得这有点奇怪,我不确定这样做是否正确 下面是我得到_id的结果并将其作为“productId”变量插入后的想法 因此,我正在征求专家对此的意见 另一个问题是如何获得

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

我需要对一本书进行一次野外搜索,并返回图书的结果,加上价格和分店名称的详细信息

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

我能得到结果。得到结果后的想法是使用结果集和查询到视图中的所有_id来获取更多细节,如其他文档上的价格和门店名称,我觉得这有点奇怪,我不确定这样做是否正确

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

因此,我正在征求专家对此的意见

另一个问题是如何获得门店\分支机构\名称?是否可以在一个视图中完成此操作,从而获得产品详细信息、价格和门店分店名称?或者我需要有几个观点来实现这一点

预期结果

参考资料:

关系

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


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

对于问题的第一部分,如果您使用Cloudant Query的
$regex
运算符进行类似的通配符搜索,您最好创建
“text”
类型的Cloudant查询索引,而不是
“json”
类型的索引。它在Cloudant文档中,但有关详细信息,请参阅简介博客文章:有一篇更高级的文章介绍了这两种索引之间的权衡

在不了解应用程序如何与数据交互的情况下,很难回答问题的第二部分,但这里有几条建议

1)考虑对这些信息进行一些非规范化处理,这样就不会开始进行连接。

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

第二个很好,但看看YouTube上的这个例子:

下面是我所说内容的预览(示例贴图功能):

'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} );
        }
    }
这里生成的二级索引将利用中概述的规则--字符串在数组之前排序,数组在对象之前排序。然后,您可以发出范围查询来模拟使用联接得到的结果


我认为这是最适合这里的细节。希望有帮助

谢谢你的回答,很抱歉现在才回复,可能我还不太清楚我在解释中要做什么。总之,我只想列出书店分店的图书清单和价格。根据上述文件。实际上,我已经通过将store和store分支合并为1个文档来对它们进行了非规范化。关于第二个问题,我实际上很难在单个查询中引用存储分支id。我的“关系”文档包含产品id、门店id和价格。问题是我不知道如何在store文档中引用带有branch[]的store\u branch\u id,因为它是嵌套对象
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...**

    }
  ]
}
'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} );
        }
    }