在Cloudant noSQL DB中搜索许多参数

时间:2017-07-10 23:25:16

标签: node.js database ibm-cloud cloudant

我在Bluemix上使用Cloudant数据库来存储Node.js服务器中的产品。这些产品将按类别进行搜索。要查找只有一个类别的产品,不会有问题,因为通过将作为搜索参数发送的字符串与保存在数据库中的类别字符串进行比较来进行搜索。当产品具有两个或更多类别时会发生此问题。在将字符串与字符串进行比较时,它永远不会重合。

产品可以根据需要分类。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您可能希望将category存储为字符串数组并索引数组中的每个元素。然后,您可以针对单个或多个类别搜索产品。

例如,给出以下文件:

doc 1

{
  "name": "product1",
  "category: ["abc"]
}

doc 2

{
  "name": "product2",
  "category: ["abc", "def"]
}

您可以设置类似于以下内容的搜索索引:

function (doc) {
  if (doc.category) {
    for (var i in doc.category) {
      index("category", doc.category[i], {"store": true, "facet": true})
    }
  }
}

然后你可以运行这样的查询:

.../{dbname}/_design/{designdocname}/_search/{searchindexname}?q=category:abc

将返回product1和product2 或者:

.../{dbname}/_design/{designdocname}/_search/{searchindexname}?q=category:abc+AND+category:def

只返回product2。

其他信息:https://developer.ibm.com/clouddataservices/cloudant-search/

答案 1 :(得分:1)

您应该在Cloudant数据库中的数组格式中存储一个或多个类别" category"参数

{
  "_id": "producto1",
  "category: ["TV", "cameras", "computers"]
}

然后你应该创建一个搜索索引

function (doc) {
  if (doc.category) {
    for (var i in doc.category) {
      index("category", doc.category[i], {"store": true, "facet": true})
    }
  }
}

现在您可以从Cloudant查询

查询文档
{
  "selector": {
    "_id": {
      "$gt": 0
    },
    "category": {
      "$all": [
        "TV",
        "cameras"
      ]
    }
  },
  "fields": [
    "_id",
    "_rev"
  ],
  "sort": [
    {
      "_id": "asc"
    }
  ]
}

或者您可以使用

https://{url_database}/{name_database}/_design/{name_design}/_search/{name_search}?q=category:TV