欢迎来到千学网!
您现在的位置:首页 > 实用文 > 其他范文

Lua 操作 MongoDB 数据库实例

时间:2025-10-07 07:55:25 其他范文 收藏本文 下载本文

这次小编在这里给大家整理了Lua 操作 MongoDB 数据库实例,本文共5篇,供大家阅读参考。

篇1:Lua 操作 MongoDB 数据库实例

这篇文章主要介绍了Lua 操作 MongoDB 数据库实例,本文给出了修改后的lua-mongo API和具体的操作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)

篇2:python中常用的各种数据库操作模块和连接实例

-04-04Python中的map、reduce和filter浅析

2014-01-01使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤

2014-02-02python基础教程之python消息摘要算法使用示例

2014-05-05Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)

-03-03python解决字典中的值是列表问题的方法

2013-12-12python共享引用(多个变量引用)示例代码

2013-12-12使用Python进行稳定可靠的文件操作详解

2014-03-03Python help()函数用法详解

2014-01-01python使用rsa加密算法模块模拟 登录

2014-04-04Python删除指定目录下过期文件的2个脚本分享

篇3:python中常用的各种数据库操作模块和连接实例

最近更 新

python控制台显示时钟的示例

Python模块学习re 正则表达式

Python设计模式之单例模式实例

Python subprocess模块学习总结

python计算最小优先级队列代码分享

pycharm 使用心得(六)进行简单的数据库

Python GAE、Django导出Excel的方法

Python中删除文件的程序代码

python解析xml文件实例分享

理解python多线程(python多线程简明教程

热 点 排 行

Python入门教程 超详细1小时学会

python 中文乱码问题深入分析

比较详细Python正则表达式操作指

Python字符串的encode与decode研

Python open读写文件实现脚本

Python enumerate遍历数组示例应

Python 深入理解yield

Python+Django在windows下的开发

python 文件和路径操作函数小结

python 字符串split的用法分享

篇4:实例:用触发器生成数据库表的数据操作日志

作为一名数据库管理员,你尽力以各部门熟知的不同格式,向各部门提供它们所需要的数据,你通常将MS Excel格式的数据递交到会计部门,或将数据以HTML报表的形式呈现给普通用户。你们的系统安全管理员们则习惯于用文本阅读器或者事件查看器来查看日志。本文将介绍如何使用触发器,把DML(数据操作语言)对数据库中的特定数据表的改动记录下来。注:下列例子为Insert型触发器,不过改成Delete/Update型的触发器也很容易。

操作步骤首先让我们在Northwind数据库内创建一个简单表。

create table tablefortrigger

(

track int identity(1,1) primary key,

Lastname varchar(25),

Firstname varchar(25)

)

创建好这个数据表后,添加一个标准message到master数据库的sysmessages数据表中。注意,我所添加的是一个参变量,用以接受一个字符值,它将被输出显示给管理员们。通过设置@_with_log参数为true,我们包管相关结果被发送到事件日志。

sp_addmessage 50005, 10, '%s', @with_log = true

现在我们创建这条用有意义的信息填充的消息。下面的信息将填充这条消息,并且记录到文件中:

・操作的类型(插入)。

・受到影响的数据表。

・改动的日期与时间。

被该语句插入的全部字段。 下面的这个触发器用预定义值(1~3个字符)创建一个字符串,该预定义值位于inserted数据表中。(这个inserted数据表驻留在内存中,它容纳 入到触发器所在数据表的记录行)。触发器连接这些值并放到一个@msg变量。然后这个变量被传送到raiserror函数,该函数将它写到事件日志中。

Create trigger TestTrigger on

tablefortrigger

for insert

as

--声明储存消息的变量

Declare @Msg varchar(8000)

--将“操作/表名/日期时间/插入字段”赋与消息

set @Msg = 'Inserted | tablefortrigger | ' + convert(varchar(20), getdate) + ' | '

+(select convert(varchar(5), track)

+ ', ' + lastname + ', ' + firstname

from inserted)

--产生错误发送给事件查看器,

raiserror( 50005, 10, 1, @Msg)

运行以下语句对触发器进行测试,然后查看事件日志:

Insert into tablefortrigger(lastname, firstname)

Values('Doe', 'John')

如果你打开事件日志,你应该看到以下消息:

既然我们已经有办法写入事件日志了,那么让我们修改一下触发器,将数据写到一个文本文件中。这次改动还须添加另一个变量@CmdString,以及使用扩展储存过程xp_cmdshell。

因为我们要写入文件系统,安全权限开始有影响了。所以,执行插入操作的用户必须具备该文本文件的读写权限。因此,设计一个C/S结构的应用程序供多用户运行,或许不是一个可行的解决方案。更合理的方案是,设计一个三层应用程序,由你的中间层组件对单用户数据库进行调用。在后一个方案中,对那个文本文件的权限管理其实比管理一个用户还容易。

Alter trigger TestTrigger on

tablefortrigger

for insert

as

Declare @Msg varchar(1000)

--储存将由xp_cmdshell执行的命令

Declare @CmdString varchar ()

set @_msg = ' insert | tablefortrigger | ' + convert ( varchar ( 20 ) , getdate ( ) ) + ' | ' + ( select convert ( varchar ( 5 ) , track ) + ' , ' + lastname + ' , ' + firstname from insert ) -

[99%]set @Msg = 'Inserted | tablefortrigger | ' + convert(varchar(20), getdate()) + ' | ' +(select convert(varchar(5), track) + ', ' + lastname + ', ' + firstname from inserted)

--产生错误发送给事件查看器。

raiserror( 50005, 10, 1, @Msg)

set @CmdString = 'echo ' + @Msg + ' >>C:\\logtest.log'

--写到文本文件

exec master.dbo.xp_cmdshell @CmdString

让我们对它进行测试,先运行前面的插入语句,然后打开C:\\logtest.log文件查看结果:

Insert into tablefortrigger(lastname, firstname) Values('Doe', 'John')

问题解决了,对不对?哦,还没完全解决。发生多次重复插入的事件是什么原因?在这个例子中,你必须分别地处理每条记录。为了达到这个目的,我们必须用一个会带来麻烦的游标来访问“隐蔽面”。在执行以前,我必须预先给予警告。你应当了解的是,当这个应用程序进行大规模地记录插入、更新或删除时要当心,因为它可能会耗费大量的内存。

像你从下面看到的一样,这次我们在前面那个例子的基础上稍加调整,引入了一个游标,对该插入表的全部记录进行循环读取。每条记录分别插入一条线条,将各个事件区分

篇5:munin 监控 mongodb数据库配置方法linux操作系统

munin是是一个非常好用安装和设置方便的监测软件,可监控核心系统资源,包括内存、磁盘、CPU 占用、服务器应用如 MySQL、Apache 和 Squid 等

首先启用Mongodb的httpinterface

修改 mongodb.conf

注释此行

代码如下复制代码#nohttpinterface = true

httpinterface 端口为 mongodb端口+1000

如mongodb默认端口为 27018 则httpinterface 为 28018

需要重启mongodb

下载插件

代码如下复制代码

#wget github.com/erh/mongo-munin/tarball/master

下载下来文件名是 master 重命名之后再解压

代码如下复制代码

#tar xvf erh-mongo-munin-*tar.gz

#cp erh-mongo-munin-*/mongo_* /etc/munin/plugins/

#munin-node restart

在munin服务节点上

代码如下复制代码

#sudo -u munin /usr/share/munin/munin-update

$ cd /etc/munin/plugins/

$ munin-run mongo_ops

getmore.value 0

insert.value 46235

update.value 44290

command.value 13918

query.value 444044

delete.value 0

python中常用的各种数据库操作模块和连接实例

Lua基本语法

mongodb学习(索引详解)

数据库填空题

操作心得体会

趣味答辩状实例

背词实例

LSAT写作实例

职业生涯规划实例

仲裁协议书实例

《Lua 操作 MongoDB 数据库实例(集锦5篇).doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

点击下载本文文档