我一直认为 NoSQL(Cassandra、CouchDB、Couchbase、MongoDB 等)是面向文档的(NO JOIN)。典型的句子:“如果需要JOIN,请使用SQL数据库(MySQL、PostgreSQL等)”
但现在,Couchbase 宣布了支持 JOIN 的 N1QL(开发者预览版 4):
http://blog.couchbase.com/introducing-developer-preview-for-couchbase-server-4.0
网上试试:
http://query.pub.couchbase.com/tutorial/#42
所以,我很困惑。Couchbase 是第一个支持 JOIN 的 NOSQL 数据库?使用它有什么缺点吗?为什么其他NOSQL数据库(如mongodb、couchdb、cassandra等)没有实现它?
我在沙发上有一个以 uuid 为键的对象。
"user": {
"f5ada4b8-cb68-4c85-a48d-87a1217963ca": [
{
"user_variant_id": false,
}
]
}
Run Code Online (Sandbox Code Playgroud)
我想访问用户 ['f5ada4b8-cb68-4c85-a48d-87a1217963ca']。但是这种表示法在 N1QL 选择语句中不起作用。有人可以帮忙吗。提前致谢
是否可以使用N1QL?
例如我有这个:
{
"blog": "Coffee",
"user_id": 41,
"comments": [
{
"comment": "cup",
"user_id": 883
},
{
"comment": "water",
"user_id": 790
}
]
}
Run Code Online (Sandbox Code Playgroud)
我想使用N1QL在注释中添加糖,以得到以下结果:{“ blog”:“ Coffee”,“ user_id”:41,“ comments”:[{“ comment”:“ cup”,“ user_id”:883}, {“ comment”:“水”,“ user_id”:790},{“ comment”:“糖”,“ user_id”:14}]}
我尝试了这个:
UPDATE
Blog
SET
`c.comment` = "sugar",
`c.user_id` = 14
FOR
c IN comments
WHERE
`blog` = "Coffee"
// [{"code":3000,"msg":"syntax error - at WHERE"}
Run Code Online (Sandbox Code Playgroud)
和这个:
UPDATE
Blog
SET
("comments", { "comment": "sugar", "user_id": 14})
WHERE
`blog` = "Coffee"
//[{"code":3000,"msg":"syntax error - at ("}
Run Code Online (Sandbox Code Playgroud) 在Couchbase环境中需要帮助查询.
文档1和文档2都在同一个桶中.
首先,查询将使用此查询获取文档message1:
SELECT uid, message, sent_by FROM bucket USE KEYS "message1"
Run Code Online (Sandbox Code Playgroud)
其次,它需要从文档2获取用户名.如何使用上面的查询创建一个从给定文档名称获取用户名的连接语句?
文档1 文档名称= message1
[
{
"uid": "1",
"message": "hello",
"sent_by": "username"
}
]
Run Code Online (Sandbox Code Playgroud)
文档2 文档名称= user1
[
{
"username": "username"
}
]
Run Code Online (Sandbox Code Playgroud) 我在桶里有很多文件
{ prop1: value, prop2: value, prop3: value}
Run Code Online (Sandbox Code Playgroud)
但是有些文件没有prop3字段.
如何使用n1ql查询检索所有没有prop3字段的文档?
我刚开始学习Couchbase.我正在尝试使用java sdk编写基本查询,但我无法理解如何编写它.以下是查询:
SELECT *
FROM users_with_orders usr
JOIN orders_with_users orders
ON KEYS ARRAY s.order_id FOR s IN usr.shipped_order_history END
Run Code Online (Sandbox Code Playgroud)
这是为了没有数组加入:
LetPath path = select("*,META(usr).id as _ID,META(usr).cas as _CAS).from(bucketName +" usr").join(bucketname +" orders").onKeys("usr.order_id)
Run Code Online (Sandbox Code Playgroud)
我应该如何处理on keys数组的上述查询?
谢谢!!!!
Couchbase 5.5 N1Ql
我在沙箱 couchbase 数据库中有 150k 个文档,其中文档名称采用以下格式:
alpha_model::XXXXXXX::version
Run Code Online (Sandbox Code Playgroud)
当我运行此命令时:
SELECT META().id FROM Q1036628 WHERE META().id LIKE "alpha_model::100004993::%" LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
结果计数:5。经过的时间是 1.13s
但是,当我在 '_' 之前添加一个 '\' 时,性能会大大提高
SELECT META().id FROM Q1036628 WHERE META().id LIKE "alpha\\_model::100004993::%" LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
结果计数:5。经过的时间是 8.16ms
为什么第二种方式要快 100 倍以上?下划线不好吗?是否还有其他字符我应该转义以提高性能
我在存储桶学生记录中有一个文档“学生”,其中记录了 id。
{
"id":"101",
"fname": "abc",
"lname": "xyz",
"rank": "1",
"scholarShip": "",
"grade": ""
}
Run Code Online (Sandbox Code Playgroud)
我的工作是找到所有排名为 1 的学生,然后在相应的文档中更新“奖学金”和“成绩”。
我在 Couchbase 中创建了一个事件函数,如下所示
function OnUpdate(doc, meta) {
log('docId', meta.id);
try {
var rankValue = SELECT rank FROM `student-records` USE KEYS ["id"];
for (var rv of rankValue) {
if (rv==1) {
UPDATE `student-records` USE KEYS ["id"] set scholarShip="100%", grade="A";
}
}
} catch(e) { log(e); }
}
Run Code Online (Sandbox Code Playgroud)
在部署这个时,我收到一个错误:
部署失败:语法错误 (7, 16) - 无法在存储桶“student-records”上执行 DML 查询
在创建函数时,我已经声明:
源存储桶 => 学生记录
元数据桶=>学生记录元数据
我是相当新的couchbase,并试图找到我正在尝试创建的特定查询的答案到目前为止没有太大的成功.
我已经在使用视图或N1QL来讨论这个特殊情况并且使用N1QL解决了但是没有设法使它工作,所以也许一个视图更好.
基本上我有以下文档的文档密钥(Group_1):
Group_1
{
"cbType": "group",
"ID": 1,
"Name": "Group Atlas 3",
"StoreList": [
2,
4,
6
]
}
Run Code Online (Sandbox Code Playgroud)
我还有"存储"文档,它们的密钥列在本文档的商店列表中.(Store_2,Store_4,Store_6并且它们的storeID值为2,4和6)我基本上想要获得列出的所有3个文档.
我所做的工作是通过以下方式获取此文档的ID:
var result = CouchbaseManager.Bucket.Get<dynamic>(couchbaseKey);
mygroup = JsonConvert.DeserializeObject<Group> (result.ToString());
Run Code Online (Sandbox Code Playgroud)
然后我可以循环遍历它的商店列表并以相同的方式获取它的所有商店,但我不需要该组中的任何其他内容,我想要的只是商店,并且希望在单个操作中执行此操作.
有谁知道如何直接对指定的文档值执行N1QL?类似的东西(这是完全虚构的非工作代码,我只是想清楚地说明我想要的东西):
SELECT*FROM mycouchbase WHERE documentkey IN Group_1.StoreList
谢谢
更新: 所以Nic的解决方案不起作用;
这是我最接近我需要的东西:
SELECT b from DataBoard c USE KEYS ["Group_X"] UNNEST c.StoreList b;
"results":[{"b":2},{"b":4},{"b":6}]
Run Code Online (Sandbox Code Playgroud)
这将返回我想要的任何给定组(Group_X)的商店的ID列表 - 我还没有找到一种方法来获取完整的商店而不仅仅是同一语句中的ID.
一旦我有了,我将发布完整的解决方案以及我在此过程中遇到的所有减速带.
我在同一默认Bucket中有三个json,如下所示
我怎么能加入这三个json?
第一
"Country|1":{
"_id": 1,
"_type": "Country",
"currency": "Afghani",
"iso2": "AF",
"name": "Afghanistan"
}
Run Code Online (Sandbox Code Playgroud)
第二
"Company|a1091aa0-b548-11e6-957e-139be07f46df":
{
"_id": "a1091aa0-b548-11e6-957e-139be07f46df",
"_type": "Company",
"companyTypes": [
1
],
"country": "Country|1",
}
Run Code Online (Sandbox Code Playgroud)
第三
"Campaign|1001":{
"_id": 1001,
"_type": "Campaign",
"banners": [],
"carriers": [
"Telstra"
],
"country": 1,
"created": "2016-03-08T18:30:00.000Z",
}
Run Code Online (Sandbox Code Playgroud)
这里的关键是"name | _id",我在每个json之前都有.
我有这种类型所有json.我尝试通过引用此源Couchbase N1QL连接查询来加入下面的查询
SELECT d1.*,d2.* FROM
default d1 USE KEYS "Company|a1091aa0-b548-11e6-957e-139be07f46df"
JOIN default d2 ON KEYS d1.country;
Run Code Online (Sandbox Code Playgroud)
我得到了渴望的结果.
但当我删除USE KEYS"公司| a1091aa0-b548-11e6-957e-139be07f46df"然后运行以下查询我得到INDEX错误 …