Couchbase索引和N1QL查询

时间:2018-05-26 23:43:08

标签: couchbase n1ql couchbase-view

我在我的couchbase服务器上创建了一个新的存储桶FooBar。

我有一个Json Document,它是一个包含一些属性的List,它位于我的couchbase存储桶中,如下所示:

[
{
"Venue": "Venue1",
"Country": "AU",
"Locale": "QLD"
},
{
"Venue": "Venue2",
"Country": "AU",
"Locale": "NSW"
  },

  {
    "Venue": "Venue3",
    "Country": "AU",
    "Locale": "NSW"
}
]

如何在使用N1QL查询时获取couchbase查询以返回位置列表。

例如,SELECT * FROM FooBar WHERE Locale =' QLD'

请告诉我我需要创建的任何索引。另外,我如何只返回对象类型为Location的结果,而不是说另一个可能具有' Locale'属性。

CHUD

PS - 我也创建了一些索引,但是我想要一个关于如何实现这一目标的公正答案。

2 个答案:

答案 0 :(得分:1)

通常,您将这些文档存储为单独的文档,而不是作为对象数组存储在单个文档中,这就是当前数据的显示方式。

由于您可以混合文档结构,因此区分它们的常用模式是具有类似“类型”字段的内容。 ('type'绝不是特别的,只是最常见的选择。)

所以你的例子看起来像:

{
  "Venue": "Venue1",
  "Country": "AU",
  "Locale": "QLD",
  "type": "location"
}
...
{
  "Venue": "Venue3",
  "Country": "AU",
  "Locale": "NSW",
  "type": "location"
}

其中每个JSON对象都是具有唯一文档ID的单独文档。 (如果您要加载一些预定义数据,请查看cbimport如何将其添加到数据库中。有几种不同的格式可供您使用。您也可以让它为您生成文档ID。)

然后,@ vsr写的是正确的。您将在Locale字段上创建索引。这对于您想要的查询来说是最佳的。请注意,您也可以使用CREATE INDEX ix1 ON FooBar(Locale);在每个文档上创建索引。在这个简单的情况下,它并没有真正有所作为。阅读管理控制台的查询说明功能,以获取帮助以了解优化查询。

最后,查询@vsr写道也是正确的:

SELECT * FROM FooBar WHERE type = "Location" AND Locale = "QLD";

答案 1 :(得分:0)

在FooBar上创建索引ix1(区域设置);

https://dzone.com/articles/designing-index-for-query-in-couchbase-n1ql

CREATE INDEX ix1 ON  FooBar(Locale) WHERE type = "Location";
SELECT * FROM FooBar WHERE type = "Location" AND Locale = "QLD";

如果是数组并且字段名称是列表

CREATE INDEX ix1 ON  FooBar(DISTINCT ARRAY v.Locale FOR v IN list END) WHERE type = "Location";
SELECT * FROM FooBar WHERE type = "Location" AND ANY v IN list SATISFIES v.Locale = "QLD" END;