最近有個工作是使用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 = }, ["status"] = , ["create_time"] = }
local mongo_sort =
local mongo_limit = 100
local mongo_skip = 0
local mongo_fields =
-- 涉及到時間的字段,需要使用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)
endelse
mongo_query["create_time"] = cbson.date(create_time)
endend
local conn = mongo.client()
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)
endlocal 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()
endlocal 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
endend
endresult = results
status_code = 200
status_msg = "ok"
message = "success"
end-- findone
local results = col:findone()
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
endend
result = results
status_code = 200
status_msg = "ok"
message = "success"
endngx.status = status_code
json_out = cjson.encode()
ngx.header["content-length"] = json_out:len()
ngx.print(json_out)
MongoDB 資料庫操作
1 插入記錄 使用資料庫 如果沒有該資料庫就會建立,有就進入該模式 use use my testdb 插入資料 db.user.insert db.user.insert 顯示資料庫 show dbs my mongodb是隱式建立的資料庫 顯示表 show collections user是隱式...
java 操作MongoDB資料庫
建立了乙個mongodb的資料庫連線物件,它預設連線到當前機器的localhost位址,埠是27017 mongo mongo new mongo mongo mongo new mongo 127.0.0.1 27017 for string name mongo.getdatabasenames...
mongodb資料庫基本操作
一般來說,涉及到mongodb的操作主要有四種 增刪查改。nodejs可以很方便簡潔的實現這些操作。準備工作 連線mongodb伺服器 var server new mongodb.server localhost 27017,這裡server就指本地 localhost 的伺服器 連線伺服器上的資...