Couchbase索引和N1QL查询

Couchbase索引和N1QL查询,couchbase,n1ql,couchbase-view,Couchbase,N1ql,Couchbase View,我在couchbase服务器上创建了一个新的bucket FooBar 我有一个Json文档,它是一个带有一些属性的列表,它位于我的couchbase bucket中,如下所示: [ { "Venue": "Venue1", "Country": "AU", "Locale": "QLD" }, { "Venue": "Venue2", "Country": "AU", "Locale": "NSW" }, { "Venue": "Venue3", "Country":

我在couchbase服务器上创建了一个新的bucket FooBar

我有一个Json文档,它是一个带有一些属性的列表,它位于我的couchbase bucket中,如下所示:

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

  {
    "Venue": "Venue3",
    "Country": "AU",
    "Locale": "NSW"
}
]
使用N1QL查询时,如何让couchbase查询返回位置列表

例如,从FooBar中选择*,其中Locale='QLD'

请让我知道我需要创建的任何索引。此外,如何仅返回对象类型为Location的结果,而不返回另一个可能具有“Locale”属性的对象

丘德


PS-我还创建了一些索引,但是我想就如何实现这一点给出一个公正的答案。

在FooBarLocale上创建索引ix1

如果是数组,文件名是list

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;

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

因为您可以混合文档结构,所以区分它们的通常模式是使用类似“类型”字段的内容“类型”一点也不特别,只是最常见的选择

因此,您的示例如下所示:

{
  "Venue": "Venue1",
  "Country": "AU",
  "Locale": "QLD",
  "type": "location"
}
...
{
  "Venue": "Venue3",
  "Country": "AU",
  "Locale": "NSW",
  "type": "location"
}
其中每个JSON对象都是一个单独的文档,具有唯一的文档ID。如果您有一些要加载的预定义数据,请查看cbimport以了解如何将其添加到数据库中。有几种不同的格式可供使用。您还可以让它为您生成文档ID

那么,@vsr写的是正确的。您需要在Locale字段上创建一个索引。这对于您想要的查询来说是最佳的。注意,您可以使用FooBarLocale上的create index ix1在每个文档上创建索引;也在这个简单的例子中,这并没有真正的区别。请阅读管理控制台的查询解释功能,以获取使用该功能理解优化查询的帮助

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

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

您显示的JSON是一个对象数组。通常,这些文件都是单独的文件。我只是想验证你是否真的想要查询一个数组,就像你在回答之前展示的那样。嗨,霍德,在这个阶段,它是一个数组。但很高兴根据您对数据模型的建议进行更改。如果您能提供这两种方法,我们将不胜感激。
SELECT * FROM FooBar WHERE type = "Location" AND Locale = "QLD";