我在我的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 - 我也创建了一些索引,但是我想要一个关于如何实现这一目标的公正答案。
答案 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;