Cloudant多数据库查询

时间:2016-04-04 13:37:36

标签: cloudant database nosql

所以我的标准看起来像这样:

{
    _id: '1234',
    name: 'Weight',
    states: [{
        _id: '5678',
        name: 'Heavy',
        filters: [{
            type: 'field',
            operator: '>',
            field: 'weightWithBattery',
            expression: '100'
        }]
    }, {
        _id: '91011',
        name: 'Light',
        filters: [{
            type: 'field',
            operator: '<',
            field: 'weightWithBattery',
            expression: '101'
        }]
    }]
}

这只是一个例子,我有很多。 包含这些文档的数据库恰当地命名为标准

现在我想创建一个名为 persona 的新数据库,其中的文档看起来像这样:

{
    name: 'Weekender',
    states: [91011]
}

因此,在这种情况下,周刊需要项。州指的是标准中的。 我遇到的问题是我对cloudant很新,所以我不知道如何设置它(即使我应该使用一个单独的数据库),我也不知道如何建立一个查询,这样如果我得到 persona 我希望它能够拉入分配给它的所有状态(就像我猜的那样)。

有人能帮助我吗?

1 个答案:

答案 0 :(得分:0)

我认为你有几个选择。首先,视图不能跨不同数据库组合数据。因此, NOT 工作的一个选项是具有两个数据库的单个视图。

我认为最直接的方法是使用两个数据库并进行两次调用。第一个调用将检索persona。第二次调用将使用states对象上的persona数组来从criteria数据库中检索状态。第二个电话看起来像这样:

{
  "selector": {
    "_id": { "$gt": null },
    "states": {
      "$elemMatch" : {
        "_id": {"$in": ["91011","xyz"] }
      }
    }
  },
  "fields": [
    "_id",
    "_rev",
    "states"
  ]
}

注意:这将返回条件状态的criteria所有的_id,如下所示:

{
  "_id": "1234",
  "_rev": "2-c61f92414e9f016e9fae97a9c1214dc5",
  "states": [
    {
      "_id": "5678",
      "name": "Heavy",
      "filters": [{
        "type": "field",
        "operator": ">",
         "field": "weightWithBattery",
         "expression": "100"
      }]
    },
    {
      "_id": "91011",
      "name": "Light",
      "filters": [{
        "type": "field",
        "operator": "<",
        "field": "weightWithBattery",
        "expression": "101"
      }]
    }
  ]
}

因此,在代码中,您必须过滤掉那些匹配的状态。解决此问题的一种方法是将状态存储为自己的数据库中的单个文档。然后你的第二个查询将在states数据库上,看起来像这样:

{
  "selector": {
    "_id": {
      "$gt": null,
      "$in": ["91011","xyz"]
    }
  },
  "fields": [
    "_id",
    "_rev"
  ]
}

除非在标准文档中保存状态,否则我会倾向于此实现。

最后,有一种方法可以在一个查询中返回criteriapersona - 类似于JOIN中的SQL。这将涉及向每个文档添加type字段,创建视图以及使用特殊过滤器查询该视图。如果您有兴趣,可以在这里了解更多信息:

https://cloudant.com/blog/sql-joins/