我正在学习Couchbase,现在是3.x版
我的疑问是,我何时应该使用N1QL查询与View查询?
而且,它们之间是否存在性能差异?
注意:我有一个情况:
一个桶有两个文档类型为我的旅行应用程序:路线和城市
一个路由文档保存有关行驶路线的阵列信息城 IDS是它的一部分,然后另一文档保存城市的信息(每个城市有自己的文档).例:
//Bucket : "Traveling App"
{
"type" : "route"
"name" : "The Great Adventure",
"cities" : ["234", "h4345", "h42da"]
}
{
"type" : "city",
"name" : "Little Town",
"UID" : "234"
}
Run Code Online (Sandbox Code Playgroud)
当我查询某个旅行路线时,我应该进行N1QL查询还是查看查询?
因为我必须首先打开Route doc,获取cities数组而不是获取每个City doc.
我认为这种架构最好,因为有些路线可能只有很少的城市而其他路线可能有很多城市.
使用Couchbase服务器4.1.0(和4.5),Java SDK 2.2.8(也尝试使用2.2.7,2.3.1和2.3.3),我有一个利用二级索引的查询,当我运行我的代码时它运行正常本地甚至通过AWS服务器上的CBQ(CBQ大约需要3毫秒).但是,当在AWS上运行我的应用程序时,我得到一个TimeOutException
,它只有一个查询超时,其他查询不是.详情见下文.
值得注意的是我的Couchbase设置有3个桶.
示例文档:
"bucketName": {
"userName": "User_A",
"MessageContent": "This is a message",
"docType": "msg",
"ParentMsgId": "1234",
"MsgType": "test",
"expireTimestamp": 1454975772613,
"publishTimestamp": 1455322362028,
"id": "145826845",
"urls": [],
"subject": "this is a subject",
"type": 1,
"GroupId": "Group_1"
}
Run Code Online (Sandbox Code Playgroud)
二级指数:
CREATE INDEX `indexName` ON `bucketName`(`ParentMsgId`,`docType`,`publishTimestamp`) USING GSI
Run Code Online (Sandbox Code Playgroud)
从中提取的示例查询 N1qlQuery#n1ql()
{"statement":
"select count(*) as msgCount from bucketName
where ParentMsgId is not missing and docType = 'msg'
and ParentMsgId IN $parentId
and publishTimestamp between $startTime and $endTime
","$endTime":1470726861816,
"$startTime":1470640461816,
"$parenIds":["fa11845b-9ea5-4778-95fe-e7206843c69b"]
} …
Run Code Online (Sandbox Code Playgroud) 当仅使用IN运算符时,以下查询正常工作
SELECT META().id FROM bucket_name WHERE description IN ['Item1','Item2']
但是,当我触发此查询时,它会给我一个空白的结果
SELECT META().id FROM bucket_name WHERE id = 123 AND description IN ['Item1','Item2']
我做错了什么或其他人遇到过同样的问题?
我正在使用Couchbase 4.0 beta和java-client 2.1.3.
该Bucket.get(id)
收益JsonDocument
从中我能得到id
并且cas
还有内容.现在我想使用查询二级索引N1QL (select *)
.但是,QueryResult
只返回JsonObject
s的行,它们只是文档内容.无论如何我还能获得元数据(id
和cas
)吗?
我一直在测试Couchbase 5并创建了一个名为fp-conversion-data
其中包含一些JSON数据的存储桶.我一直在尝试运行一些简单的查询,例如:
SELECT * FROM fp-conversion-data limit 5;
Run Code Online (Sandbox Code Playgroud)
我没有得到预期的结果,而是一直收到这个错误:
[
{
"code": 4010,
"msg": "FROM expression term must have a name or alias",
"query_from_user": "SELECT * FROM fp-conversion-data limit 5;"
}
]
Run Code Online (Sandbox Code Playgroud) SELECT (SELECT RAW subcomments
FROM comments.subcomments AS subcomments
JOIN users ON subcomments.userId = users.id
ORDER BY subcomments.createdDate DESC) as subcomments,
ARRAY_COUNT(comments.subcomments) as subcommentCount
FROM comments where comments.id = "f4f0f481-f0d6-4edf-8a0c-494651becdf2" and projectId= "1"
Run Code Online (Sandbox Code Playgroud)
当我尝试运行此查询时,收到以下错误:
[
{
"code": 5370,
"msg": "Unable to run subquery - cause: FROM in correlated subquery must have USE KEYS clause: FROM users.",
"query": "SELECT (SELECT RAW subcomments \nFROM (Select * from comments.subcomments as sbcm\nJOIN users ON sbcm.userId = users.id ) as a\nORDER BY subcomments.createdDate DESC) as subcomments,\nARRAY_COUNT(comments.subcomments) …
Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用 Go 中的 Couchbase,使用库 gocb。
就像尝试向我的服务器查询特定 ID 并获取结果的概念证明一样。下面是修改后的代码示例。
cOpts := gocb.ClusterOptions{
Authenticator: gocb.PasswordAuthenticator{
Username: "user",
Password: "pw",
},
}
cluster, err := gocb.Connect("couchbase://my.dev.server.net/", cOpts)
if err != nil {
panic(err)
}
qOpts := gocb.QueryOptions{}
// create query
queryStr := "SELECT * FROM myBucket WHERE id = '123456789'"
rows, err := cluster.Query(queryStr, &qOpts)
if err != nil {
panic(err)
}
fmt.Printf("rows: %v\n", rows)
for rows.Next() {
var intfc interface{}
err = rows.Row(&intfc)
if err != nil {
panic(err)
}
fmt.Printf("interface result: …
Run Code Online (Sandbox Code Playgroud) 在沙发基地,我有以下文件结构......
{
name: "bob",
permissions: [
2,
4,
6
]
}
Run Code Online (Sandbox Code Playgroud)
我需要能够创建一个视图或N1QL查询,它将检查"bob"的权限是否包含在给定数组中.
例如,我有一个包含内容的数组
[1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)
我需要返回"bob"文档,因为我的数组包含2,4,6,所以"bob"也是如此
如果我的数组包含1,3,4,5,6"鲍勃"应该没有被选中,因为我的数组中不包含"2"
基本上我想匹配其权限条目都包含在我的数组中的任何文档.
解决方案可以是视图或N1QL查询.
我正在尝试使用couchbase
npm包运行一些N1QL查询。这是我在运行代码之前采取的步骤:
beer-sample
存储桶cbq-engine
像这样启用:
./cbq-engine -datastore=http://localhost:8091
此时,我已经localhost:8091
(主要的Couchbase集群)和localhost:8093
(DP4引擎)都已上线。
这是我从node.js客户端使用的代码,以尝试运行简单的N1QL查询:
var colors = require('colors'); // for console.log
var couchbase = require('couchbase');
var N1qlQuery = require('couchbase').N1qlQuery; // get query object
var myCluster = new couchbase.Cluster('couchbase://localhost:8091'); // connect to live local cluster
var myBucket = myCluster.openBucket(); // open bucket
myBucket.enableN1ql(['http://localhost:8093/']); // enable n1ql as per documentation (http://docs.couchbase.com/developer/node-2.0/n1ql-queries.html) - I also tried :8091, same result
var query = N1qlQuery.fromString('SELECT * FROM …
Run Code Online (Sandbox Code Playgroud) 我们在使用 couchbase N1QL 查询时遇到问题。
我们有一个索引定义如下:
CREATE INDEX `AppUser_SubjectId3` ON `Portal`(`SubjectId`) WHERE ((meta(self).`id`) like `AppUser%`)
Run Code Online (Sandbox Code Playgroud)
然后我们尝试运行以下查询:
SELECT RAW `Extent1`
FROM `Portal` as `Extent1`
USE INDEX (`AppUser_SubjectId3` USING GSI)
WHERE (`Extent1`.`SubjectId` = 'c8ea08231c3a985a06342355b87d6e2d6290a985d5c3592e5b8e5e5f14608a08')
Run Code Online (Sandbox Code Playgroud)
并得到以下错误:
键空间门户上没有与您的查询匹配的索引。
使用 CREATE INDEX 或 CREATE PRIMARY INDEX 创建索引,
或检查您的预期索引是否在线。
我们已经确认了明显的索引在线。唯一值得注意的是 Bucket 目前实际上并不包含任何文档,但我们不希望在这种情况下出现此错误,只是没有返回任何内容。
有任何想法吗?
编辑:
我创建了另一个没有 WHERE 子句的索引,它不再返回错误。
CREATE INDEX `AppUser_SubjectId4` ON `Portal`(`SubjectId`)
Run Code Online (Sandbox Code Playgroud)
唯一的问题是需要 WHERE 子句!