golang轻量级NoSQL数据库解决方案插件库tiedot的使用

Golang轻量级NoSQL数据库解决方案插件库tiedot的使用

tiedot是一个基于Golang开发的轻量级NoSQL数据库引擎,它使用JSON作为文档格式,支持嵌入式使用或通过HTTP API独立运行。

tiedot简介

tiedot是一个文档型数据库引擎,具有以下特点:

  • 使用JSON作为文档格式
  • 支持高级集合操作的强大查询处理器
  • 可以嵌入到程序中或作为独立服务器运行
  • 在*nix和Windows操作系统上运行
  • 具有容错数据结构,优先考虑数据安全
  • 轻松扩展到4+ CPU核心

tiedot性能非常稳定,即使有数百万条记录!它能持续实现高吞吐量 - 每秒可轻松处理超过12万条记录或8万次复杂查询。

安装和使用示例

基本使用示例

package main

import (
	"fmt"
	"github.com/HouzuoGuo/tiedot/db"
)

func main() {
	// 打开或创建数据库
	myDB, err := db.OpenDB("mydatabase")
	if err != nil {
		panic(err)
	}
	
	// 创建集合(相当于表)
	if err := myDB.Create("users"); err != nil {
		fmt.Println("集合已存在或创建失败:", err)
	}
	
	// 获取集合引用
	users := myDB.Use("users")
	
	// 插入文档
	docID, err := users.Insert(map[string]interface{}{
		"name": "John Doe",
		"age":  30,
		"email": "john@example.com",
	})
	if err != nil {
		panic(err)
	}
	fmt.Println("插入文档ID:", docID)
	
	// 查询所有文档
	var query interface{}
	query = map[string]interface{}{
		"eq": "John Doe",
		"in": []interface{}{"name"},
	}
	
	queryResult := make(map[int]struct{}) // 查询结果将放入这个map
	if err := db.EvalQuery(query, users, &queryResult); err != nil {
		panic(err)
	}
	
	// 遍历查询结果
	for id := range queryResult {
		// 读取文档
		readBack, err := users.Read(id)
		if err != nil {
			panic(err)
		}
		fmt.Println("查询结果:", readBack)
	}
	
	// 关闭数据库
	if err := myDB.Close(); err != nil {
		panic(err)
	}
}

索引操作示例

// 创建索引
if err := users.Index([]string{"name"}); err != nil {
    fmt.Println("创建索引失败:", err)
}

// 查询使用索引
queryWithIndex := map[string]interface{}{
    "eq": "John Doe",
    "in": []interface{}{"name"},
    "use": []interface{}{"name"}, // 指定使用name索引
}

queryResult := make(map[int]struct{})
if err := db.EvalQuery(queryWithIndex, users, &queryResult); err != nil {
    panic(err)
}

// 删除索引
if err := users.Unindex([]string{"name"}); err != nil {
    fmt.Println("删除索引失败:", err)
}

使用HTTP API

tiedot也可以作为独立服务器运行,提供HTTP API:

package main

import (
	"github.com/HouzuoGuo/tiedot/embedded"
	"log"
)

func main() {
	// 启动HTTP服务器,监听8080端口
	if err := embedded.StartServer(":8080", "mydatabase"); err != nil {
		log.Fatal(err)
	}
}

启动后可以通过HTTP API访问数据库:

  • GET /all - 列出所有集合
  • POST /create/[collection] - 创建集合
  • GET /count/[collection] - 计算集合中的文档数
  • POST /insert/[collection] - 插入文档
  • GET /get/[collection]/[id] - 读取文档
  • POST /update/[collection]/[id] - 更新文档
  • GET /delete/[collection]/[id] - 删除文档
  • POST /query/[collection] - 执行查询

注意事项

  1. 作者在2021年9月指出,该项目自2016年以来一直处于休眠状态,功能集对于现代应用程序来说较为简单,建议考虑其他嵌入式数据库引擎替代方案。

  2. tiedot使用Simplified BSD许可证分发。

  3. 最新版本3.4带来了通用性能和兼容性改进。

Docker运行

可以使用Docker快速运行tiedot:

$ docker-compose build
$ docker-compose up -d

查看日志:

$ docker-compose logs

总结

tiedot是一个轻量级的Golang NoSQL数据库解决方案,适合需要嵌入式JSON数据库的场景。虽然项目目前处于休眠状态,但对于简单的应用场景仍然可以作为一个选择。对于更复杂的需求,建议考虑其他活跃维护的数据库解决方案。


更多关于golang轻量级NoSQL数据库解决方案插件库tiedot的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang轻量级NoSQL数据库解决方案插件库tiedot的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang轻量级NoSQL数据库解决方案:tiedot使用指南

tiedot是一个用纯Go编写的轻量级NoSQL数据库,它提供了类似MongoDB的文档存储功能,但更加轻量且易于集成到Go应用程序中。

tiedot主要特点

  • 纯Go实现,无外部依赖
  • 支持文档存储和查询
  • 提供简单的JSON API
  • 支持索引加速查询
  • 嵌入式设计,无需单独服务

安装tiedot

go get github.com/HouzuoGuo/tiedot

基本使用示例

1. 创建/打开数据库

package main

import (
	"fmt"
	"github.com/HouzuoGuo/tiedot/db"
)

func main() {
	// 打开或创建数据库
	myDB, err := db.OpenDB("mydatabase")
	if err != nil {
		panic(err)
	}
	defer myDB.Close()

	// 检查数据库是否已存在某个集合
	if !myDB.ColExists("users") {
		// 创建集合(相当于表)
		if err := myDB.Create("users"); err != nil {
			panic(err)
		}
		fmt.Println("集合'users'创建成功")
	}

	// 获取集合引用
	users := myDB.Use("users")
	
	// 其他操作...
}

2. 插入文档

// 插入单个文档
docID, err := users.Insert(map[string]interface{}{
	"name":    "John Doe",
	"age":     30,
	"email":   "john@example.com",
	"active":  true,
	"hobbies": []string{"reading", "swimming"},
})
if err != nil {
	panic(err)
}
fmt.Printf("插入文档ID: %d\n", docID)

// 批量插入
docs := []map[string]interface{}{
	{"name": "Alice", "age": 25, "email": "alice@example.com"},
	{"name": "Bob", "age": 35, "email": "bob@example.com"},
}

for _, doc := range docs {
	if _, err := users.Insert(doc); err != nil {
		panic(err)
	}
}

3. 查询文档

// 查询所有文档
users.ForEach(func(id int, docContent []byte) bool {
	var doc map[string]interface{}
	if err := json.Unmarshal(docContent, &doc); err != nil {
		fmt.Println("解析文档错误:", err)
		return true // 继续迭代
	}
	fmt.Printf("ID: %d, 内容: %+v\n", id, doc)
	return true // 返回false停止迭代
})

// 按ID查询
doc, err := users.Read(docID)
if err != nil {
	panic(err)
}
fmt.Printf("按ID查询结果: %+v\n", doc)

4. 创建索引加速查询

// 为name字段创建索引
if err := users.Index([]string{"name"}); err != nil {
	panic(err)
}

// 为嵌套字段创建索引
if err := users.Index([]string{"address", "city"}); err != nil {
	panic(err)
}

5. 使用索引查询

query := map[string]interface{}{
	"eq":    "John Doe",
	"in":    []string{"name"},
}

var result []int
// 执行查询,结果存储在result中
if err := db.EvalQuery(query, users, &result); err != nil {
	panic(err)
}

fmt.Println("查询结果IDs:", result)
for _, id := range result {
	doc, _ := users.Read(id)
	fmt.Printf("ID %d: %+v\n", id, doc)
}

6. 更新和删除文档

// 更新文档
updateData := map[string]interface{}{
	"age":    31,
	"active": false,
}
if err := users.Update(docID, updateData); err != nil {
	panic(err)
}

// 删除文档
if err := users.Delete(docID); err != nil {
	panic(err)
}

高级查询示例

tiedot支持多种查询操作符:

// 范围查询
query := map[string]interface{}{
	"gt": 25,
	"lt": 40,
	"in": []string{"age"},
}

// 正则表达式查询
query := map[string]interface{}{
	"regex": "Joh.*",
	"in":    []string{"name"},
}

// 多条件AND查询
query := map[string]interface{}{
	"and": []map[string]interface{}{
		{"eq": true, "in": []string{"active"}},
		{"gt": 25, "in": []string{"age"}},
	},
}

// 多条件OR查询
query := map[string]interface{}{
	"or": []map[string]interface{}{
		{"eq": "Alice", "in": []string{"name"}},
		{"eq": "Bob", "in": []string{"name"}},
	},
}

性能优化建议

  1. 为常用查询字段创建索引
  2. 避免在大型集合上使用无索引查询
  3. 定期压缩数据库文件(使用db.Compress)

限制和注意事项

  • tiedot不适合超大规模数据(超过GB级别)
  • 不支持分布式或复制功能
  • 事务支持有限
  • 查询功能不如专业NoSQL数据库丰富

tiedot非常适合小型到中型的Go应用程序,需要嵌入式NoSQL解决方案的场景。对于更复杂的需求,可能需要考虑MongoDB等专业数据库。

回到顶部