Couchbase Scope与Collection #
一、概述 #
1.1 什么是Scope和Collection #
Scope和Collection是Couchbase 7.0引入的新特性,用于在Bucket内部组织数据:
- Scope(作用域):类似于关系数据库中的Schema,用于逻辑分组
- Collection(集合):类似于关系数据库中的Table,存储具体的文档
1.2 层级结构 #
text
Cluster(集群)
└── Bucket(存储桶)- 物理存储单元
└── Scope(作用域)- 逻辑分组
└── Collection(集合)- 文档容器
└── Document(文档)- 数据记录
1.3 与关系数据库对比 #
| Couchbase | 关系数据库 | 说明 |
|---|---|---|
| Cluster | Database Server | 数据库服务器 |
| Bucket | Database | 数据库 |
| Scope | Schema | 模式 |
| Collection | Table | 表 |
| Document | Row | 行 |
1.4 默认结构 #
每个Bucket创建时自动包含:
text
my-bucket
├── _default Scope
│ └── _default Collection
└── (可创建更多Scope和Collection)
二、Scope操作 #
2.1 创建Scope #
N1QL创建:
sql
CREATE SCOPE `my-bucket`.`my-scope`;
CREATE SCOPE `my-bucket`.`my-scope` IF NOT EXISTS;
REST API创建:
bash
curl -X POST http://localhost:8091/pools/default/buckets/my-bucket/scopes \
-u Administrator:your-password \
-d name=my-scope
SDK创建(Python):
python
from couchbase.cluster import Cluster, ClusterOptions
from couchbase.auth import PasswordAuthenticator
cluster = Cluster(
'couchbase://localhost',
ClusterOptions(PasswordAuthenticator('Administrator', 'password'))
)
bucket = cluster.bucket('my-bucket')
bucket.collections().create_scope('my-scope')
2.2 查看Scope #
查看所有Scope:
sql
SELECT * FROM system:scopes
WHERE bucket_id = 'my-bucket';
命令行查看:
bash
/opt/couchbase/bin/couchbase-cli bucket-get \
--cluster localhost:8091 \
--username Administrator \
--password your-password \
--bucket my-bucket \
--json | jq '.scopes'
2.3 删除Scope #
sql
DROP SCOPE `my-bucket`.`my-scope`;
DROP SCOPE `my-bucket`.`my-scope` IF EXISTS;
注意:删除Scope会删除其下所有Collection和文档!
三、Collection操作 #
3.1 创建Collection #
N1QL创建:
sql
CREATE COLLECTION `my-bucket`.`my-scope`.`users`;
CREATE COLLECTION `my-bucket`.`my-scope`.`users` IF NOT EXISTS;
REST API创建:
bash
curl -X POST http://localhost:8091/pools/default/buckets/my-bucket/scopes/my-scope/collections \
-u Administrator:your-password \
-d name=users
SDK创建(Python):
python
bucket.collections().create_collection('users', 'my-scope')
3.2 查看Collection #
查看所有Collection:
sql
SELECT * FROM system:keyspaces
WHERE bucket_id = 'my-bucket' AND scope_id = 'my-scope';
查看指定Bucket下所有Collection:
sql
SELECT
name,
bucket_id,
scope_id
FROM system:keyspaces
WHERE bucket_id = 'my-bucket';
3.3 删除Collection #
sql
DROP COLLECTION `my-bucket`.`my-scope`.`users`;
DROP COLLECTION `my-bucket`.`my-scope`.`users` IF EXISTS;
四、完整路径引用 #
4.1 引用格式 #
sql
SELECT * FROM `bucket-name`.`scope-name`.`collection-name`;
4.2 示例 #
sql
SELECT * FROM `my-bucket`.`_default`.`_default` LIMIT 5;
SELECT * FROM `my-bucket`.`production`.`users` WHERE type = 'user';
SELECT * FROM `my-bucket`.`development`.`test_data` LIMIT 10;
4.3 使用反引号 #
当名称包含特殊字符时需要使用反引号:
sql
SELECT * FROM `my-bucket`.`my-scope`.`my-collection`;
SELECT * FROM `my-bucket`.`scope-with-dash`.`collection_name`;
五、查询上下文 #
5.1 设置查询上下文 #
使用SET命令设置默认查询上下文:
sql
SET query_context = `my-bucket`.`my-scope`;
设置后可以简化查询:
sql
SELECT * FROM `users` LIMIT 5;
5.2 CBQ中设置 #
sql
\SET -query_context `my-bucket`.`my-scope`;
SELECT * FROM `users` LIMIT 5;
5.3 SDK中设置 #
python
from couchbase.options import QueryOptions
result = cluster.query(
'SELECT * FROM `users` LIMIT 5',
QueryOptions(query_context='my-bucket.my-scope')
)
六、实际应用示例 #
6.1 电商系统数据组织 #
text
ecommerce-bucket
├── catalog Scope
│ ├── products(产品)
│ ├── categories(分类)
│ └── brands(品牌)
├── orders Scope
│ ├── orders(订单)
│ ├── order_items(订单项)
│ └── payments(支付)
├── users Scope
│ ├── users(用户)
│ ├── addresses(地址)
│ └── preferences(偏好)
└── analytics Scope
├── page_views(页面访问)
├── search_logs(搜索日志)
└── recommendations(推荐)
创建结构:
sql
CREATE SCOPE `ecommerce`.`catalog`;
CREATE SCOPE `ecommerce`.`orders`;
CREATE SCOPE `ecommerce`.`users`;
CREATE SCOPE `ecommerce`.`analytics`;
CREATE COLLECTION `ecommerce`.`catalog`.`products`;
CREATE COLLECTION `ecommerce`.`catalog`.`categories`;
CREATE COLLECTION `ecombase`.`catalog`.`brands`;
CREATE COLLECTION `ecommerce`.`orders`.`orders`;
CREATE COLLECTION `ecommerce`.`orders`.`order_items`;
CREATE COLLECTION `ecommerce`.`orders`.`payments`;
CREATE COLLECTION `ecommerce`.`users`.`users`;
CREATE COLLECTION `ecommerce`.`users`.`addresses`;
CREATE COLLECTION `ecommerce`.`users`.`preferences`;
CREATE COLLECTION `ecommerce`.`analytics`.`page_views`;
CREATE COLLECTION `ecommerce`.`analytics`.`search_logs`;
CREATE COLLECTION `ecommerce`.`analytics`.`recommendations`;
6.2 多环境隔离 #
text
app-bucket
├── development Scope
│ ├── users
│ ├── products
│ └── orders
├── staging Scope
│ ├── users
│ ├── products
│ └── orders
└── production Scope
├── users
├── products
└── orders
查询不同环境数据:
sql
SELECT * FROM `app`.`development`.`users`;
SELECT * FROM `app`.`staging`.`users`;
SELECT * FROM `app`.`production`.`users`;
6.3 多租户架构 #
text
saas-bucket
├── tenant_001 Scope
│ ├── users
│ ├── products
│ └── orders
├── tenant_002 Scope
│ ├── users
│ ├── products
│ └── orders
└── tenant_003 Scope
├── users
├── products
└── orders
七、权限控制 #
7.1 角色类型 #
| 角色 | 权限范围 |
|---|---|
| bucket_admin | 整个Bucket的管理权限 |
| scope_admin | 指定Scope的管理权限 |
| collection_admin | 指定Collection的管理权限 |
7.2 创建Scope级别用户 #
bash
/opt/couchbase/bin/couchbase-cli user-manage \
--cluster localhost:8091 \
--username Administrator \
--password your-password \
--set \
--rbac-username scope_user \
--rbac-password password123 \
--rbac-name "Scope User" \
--roles scope_admin[my-bucket:my-scope] \
--auth-domain local
7.3 创建Collection级别用户 #
bash
/opt/couchbase/bin/couchbase-cli user-manage \
--cluster localhost:8091 \
--username Administrator \
--password your-password \
--set \
--rbac-username collection_user \
--rbac-password password123 \
--rbac-name "Collection User" \
--roles collection_admin[my-bucket:my-scope:my-collection] \
--auth-domain local
八、索引与Collection #
8.1 为Collection创建索引 #
sql
CREATE INDEX idx_users_email
ON `my-bucket`.`my-scope`.`users`(email);
CREATE INDEX idx_users_name
ON `my-bucket`.`my-scope`.`users`(name);
8.2 查看Collection索引 #
sql
SELECT * FROM system:indexes
WHERE keyspace_id = 'users'
AND bucket_id = 'my-bucket'
AND scope_id = 'my-scope';
8.3 建立索引服务 #
sql
CREATE PRIMARY INDEX ON `my-bucket`.`my-scope`.`users`;
CREATE INDEX idx_products_category
ON `ecommerce`.`catalog`.`products`(category)
WHERE type = 'product';
九、SDK操作示例 #
9.1 Python SDK #
python
from couchbase.cluster import Cluster, ClusterOptions
from couchbase.auth import PasswordAuthenticator
from couchbase.options import GetOptions, UpsertOptions
cluster = Cluster(
'couchbase://localhost',
ClusterOptions(PasswordAuthenticator('Administrator', 'password'))
)
bucket = cluster.bucket('my-bucket')
scope = bucket.scope('my-scope')
collection = scope.collection('users')
doc = {
'type': 'user',
'name': '张三',
'email': 'zhangsan@example.com',
'age': 28
}
collection.upsert('user::001', doc)
result = collection.get('user::001')
print(result.content)
query = 'SELECT * FROM `users` WHERE type = $type'
rows = cluster.query(query, QueryOptions(
query_context='my-bucket.my-scope',
named_parameters={'type': 'user'}
))
for row in rows:
print(row)
9.2 Node.js SDK #
javascript
const couchbase = require('couchbase');
const cluster = new couchbase.Cluster('couchbase://localhost', {
username: 'Administrator',
password: 'password'
});
const bucket = cluster.bucket('my-bucket');
const scope = bucket.scope('my-scope');
const collection = scope.collection('users');
const doc = {
type: 'user',
name: '张三',
email: 'zhangsan@example.com',
age: 28
};
await collection.upsert('user::001', doc);
const result = await collection.get('user::001');
console.log(result.content);
const query = 'SELECT * FROM `users` WHERE type = $1';
const options = {
parameters: ['user'],
queryContext: 'my-bucket.my-scope'
};
const { rows } = await cluster.query(query, options);
console.log(rows);
9.3 Java SDK #
java
import com.couchbase.client.java.*;
import com.couchbase.client.java.query.*;
Cluster cluster = Cluster.connect(
"localhost",
ClusterOptions.clusterOptions("Administrator", "password")
);
Bucket bucket = cluster.bucket("my-bucket");
Scope scope = bucket.scope("my-scope");
Collection collection = scope.collection("users");
JsonObject doc = JsonObject.create()
.put("type", "user")
.put("name", "张三")
.put("email", "zhangsan@example.com")
.put("age", 28);
collection.upsert("user::001", doc);
GetResult result = collection.get("user::001");
System.out.println(result.contentAsObject());
String query = "SELECT * FROM `users` WHERE type = $type";
QueryResult queryResult = cluster.query(query,
QueryOptions.queryOptions()
.queryContext("my-bucket.my-scope")
.parameters(JsonObject.create().put("type", "user"))
);
queryResult.rowsAsObject().forEach(System.out::println);
十、最佳实践 #
10.1 命名规范 #
text
Scope命名:
- 使用小写字母
- 使用下划线分隔
- 语义化命名
示例:
user_management
order_processing
analytics_reporting
Collection命名:
- 使用复数形式
- 使用小写字母
- 使用下划线分隔
示例:
users
products
order_items
10.2 组织策略 #
text
按业务领域组织:
├── customer Scope
│ ├── profiles
│ ├── preferences
│ └── activities
├── inventory Scope
│ ├── products
│ ├── categories
│ └── suppliers
└── transaction Scope
├── orders
├── payments
└── shipments
按环境组织:
├── dev Scope
├── test Scope
└── prod Scope
10.3 迁移建议 #
从旧版本迁移到Scope/Collection:
sql
CREATE SCOPE `my-bucket`.`app`;
CREATE COLLECTION `my-bucket`.`app`.`users`;
CREATE COLLECTION `my-bucket`.`app`.`products`;
INSERT INTO `my-bucket`.`app`.`users` (KEY, VALUE)
SELECT META().id, _default
FROM `my-bucket`.`_default`.`_default`
WHERE type = 'user';
十一、总结 #
Scope和Collection要点:
| 概念 | 说明 | 类比 |
|---|---|---|
| Scope | 逻辑分组 | Schema |
| Collection | 文档容器 | Table |
| Document | 数据记录 | Row |
最佳实践:
- 按业务领域组织Scope
- 使用语义化的Collection命名
- 合理设置查询上下文
- 为每个Collection创建适当的索引
- 使用权限控制保护数据
下一步,让我们学习文档插入操作!
最后更新:2026-03-27