Lua 操作 MongoDB 数据库实例
最近有个工作是使用Nginx + Lua实现一个操作MongoDB数据库的API,主要实现其count和query功能。之前没有写过Lua,于是也就勉强着上手,在cloudwu的 lua-mongo 的基础上实现了操作MongoDB的API。
cloudwu的lua-mongo驱动实现了连接Mongo,进行find和findOne等基本操作的功能,所以在lua-mongo的基础上增加了count和query等方法。修改的具体内容如下:
1、API基于luajit-2.0开发,相当于lua 5.1,需要使用lua-compat-5.2兼容lua 5.2
2、使用ngx.socket.tcp替换mongo.socket模块
3、增加了count,query,auth等方法
修改之后的代码见: lua-mongo
具体的操作MongoDB的lua代码如下:
-- lua mongo test script
-- utils
function string:split(sep)
local sep, fields = sep or ":", {}
local pattern = string.format("([^%s]+)", sep)
self:gsub(pattern, function(c) fields[#fields + 1] = c end)
return fields
end
-- 常量
HOST = "127.0.0.1"
PORT = 27017
KEEPALIVE_TIMEOUT = 60000
KEEPALIVE_SIZE = 100
CONN_TIMEOUT = 3000
DB_USER = "user"
DB_PASSWD = "password"
DB_NAME = "blog"
DB_COLLECTION = "article"
-- 引用
mongo = require("mongo")
cjson = require("cjson.safe")
cbson = require("bson")
-- 状态
local status_msg = "error"
local status_code = 500
local message = "unknown error"
local mongo_query = {["category_id"] = {["$in"] = {1,2,3,4}}, ["status"] = {["$ne"] = 2}, ["create_time"] = {["$lte"] = 1427102260}}
local mongo_sort = {["create_time"] = 1}
local mongo_limit = 100
local mongo_skip = 0
local mongo_fields = { ["_id"] = false }
-- 涉及到时间的字段,需要使用bson转化一下
if mongo_query["create_time"] then
local create_time = mongo_query["create_time"]
local t = type(create_time)
if t == "table" then
for key, value in pairs(create_time) do
mongo_query["create_time"][key] = cbson.date(value)
end
else
mongo_query["create_time"] = cbson.date(create_time)
end
end
local conn = mongo.client({ host = HOST, port = PORT })
conn:set_timeout(CONN_TIMEOUT)
local db = conn:getDB(DB_NAME)
local reused_times = conn:get_reused_times()
if reused_times == 0 then
db:auth(DB_USER, DB_PASSWD)
end
local col = db:getCollection(DB_COLLECTION)
local result = {}
-- count
local count, err = col:count(mongo_query)
local ok, err = conn:set_keepalive(KEEPALIVE_TIMEOUT, KEEPALIVE_SIZE)
if count ~= nil then
result = count
status_code = 200
status_msg = "ok"
message = "success"
end
-- query
local bson_obj
if mongo_sort then
bson_obj = cbson.encode_order("$query", mongo_query, "$orderby", mongo_sort)
else
bson_obj = cbson.encode({ ["$query"] = mongo_query })
end
local results = col:query(bson_obj, mongo_fields, mongo_skip, mongo_limit)
local ok, err = conn:set_keepalive(KEEPALIVE_TIMEOUT, KEEPALIVE_SIZE)
if results then
for _, object in pairs(results) do
for key, value in pairs(object) do
if value == cbson.null then
object[key] = cjson.null
else
local type_name, value = cbson.type(value)
object[key] = value
end
end
end
result = results
status_code = 200
status_msg = "ok"
message = "success"
end
-- findOne
local results = col:findOne({["id"] = 14 })
local ok, err = conn:set_keepalive(KEEPALIVE_TIMEOUT, KEEPALIVE_SIZE)
if results then
for key, value in pairs(results) do
if value == cbson.null then
results[key] = cjson.null
else
local type_name, value = cbson.type(value)
results[key] = value
end
end
result = results
status_code = 200
status_msg = "ok"
message = "success"
end
ngx.status = status_code
json_out = cjson.encode({ status = status_msg, message = message, data = result })
ngx.header["Content-Length"] = json_out:len()
ngx.print(json_out)
来源:http://www.jb51.net/article/62871.htm
Lua 操作 MongoDB 数据库实例相关推荐
- 58 Node.js中操作mongoDB数据库
技术交流 QQ 群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder 的程序人生 1.数据库概述及环境搭建 1.1 为什么要使用数据库 动态网站中的数据都是存储在数据 ...
- python数据库模糊查询_Python操作mongodb数据库进行模糊查询操作示例
本文实例讲述了Python操作mongodb数据库进行模糊查询操作.分享给大家供大家参考,具体如下: # -*- coding: utf-8 -*- import pymongo import re ...
- 使用mongoose 在 Node中操作MongoDB数据库
MongoDB 关系型和非关系型数据库 关系型数据库(表就是关系,或者说表与表之间存在关系). 所有的关系型数据库都需要通过sql语言来操作 所有的关系型数据库在操作之前都需要设计表结构 而且数据表还 ...
- php mongoclient使用,PHP使用mongoclient简单操作mongodb数据库示例
本文实例讲述了PHP使用mongoclient简单操作mongodb数据库.分享给大家供大家参考,具体如下: 最好回到<mongodb shell基础命令[进阶篇]>,再来看这里的内容,否 ...
- tp5连接mongo和mysql_tp5(thinkPHP5)操作mongoDB数据库的方法
本文实例讲述了tp5(thinkPHP5)操作mongoDB数据库的方法.分享给大家供大家参考,具体如下: 1.通过composer安装 composer require mongodb/mongod ...
- Java操作MongoDB数据库(简明版)
除了通过启动 mongo 进程进如 Shell 环境访问数据库外,MongoDB 还提供了其他基于编程语言的访问数据库方法.MongoDB 官方提供了 Java 和 Python 语言的驱动包,利用这 ...
- 使用第三方包mongoose来操作MongoDB数据库,解决报错:MongooseError
使用第三方包mongoose来操作MongoDB数据库 官方网站 配置文件 异常 异常描述: MongooseError: Operation cats.insertOne() buffering t ...
- Python 操作 MongoDB 数据库!
作者 |黄伟呢 来源 |数据分析与统计学之美 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 先来看看MySQL与MongoDB 概念区别 ...
- 用python向mongodb插入数据_Python操作MongoDB数据库(一)
Python操作MongoDB数据库(一) 前言 干货文章继续出发!隔的时间有些久了哈,对 MongoDB 安装回顾的同学,可以看下windows环境 <初识 MongoDB 数据库>.这 ...
最新文章
- 2 vtk 编译_OpenCV4.2使用viz模块显示3D图像
- linux shell dig nslookup 指定dns服务器 查询域名解析
- Unity学习笔记 - Assets, Objects and Serialization
- python常用异常处理
- oracle sql语句 exists
- 微软中山大学开源超强的视觉位置编码,涨点显著
- Event用计算机语言,求高人解释下一段计算机语言。
- 戏耍Transaction,多个连接的Transaction处理(非COM+)
- JDK安装与环境变量配置
- 8.3.2 构建组合行为
- D525安装黑群晖DSM6.1.7教程
- android录屏代码(录屏并生成mp4文件)
- 汇佳学校|多元艺术+探究式思维 领航国际艺术教育新趋势
- 免证书发布ipa文件真机测试
- excel日期怎么间隔填充_系列或相同日期的自动填充Excel日期
- 直播 | 骞云科技DevOps实践
- cesium实现四色预警(仿echarts)(cesium篇.50)
- js内置对象【学习笔记】
- Springboot漫游日志(18)
- 整理:C primer plus 学习笔记