树叶云MongoDB教程:Node.js 连接 MongoDB

Node.js 连接 MongoDB

MongoDB是一种文档导向数据库管理系统,由C++撰写而成。

本章节我们将为大家介绍如何使用 Node.js 来连接 MongoDB,并对数据库进行操作。

如果你还没有 MongoDB 的基本知识,可以参考我们的教程:MongoDB 教程。

安装驱动

本教程使用了淘宝定制的 cnpm 命令进行安装:

$ cnpm install mongodb

接下来我们来实现增删改查功能。


创建数据库

要在 MongoDB 中创建一个数据库,首先我们需要创建一个 MongoClient 对象,然后配置好指定的 URL 和 端口号。

如果数据库不存在,MongoDB 将创建数据库并建立连接。

创建连接

var

MongoClient
=
require
(

mongodb

)
.
MongoClient
;
var

url
=

mongodb://localhost:27017/runoob

;
MongoClient
.
connect
(
url
,
function
(
err
,
db
)

{

if

(
err
)

throw

err
;
console
.
log
(

数据库已创建!

)
;
db
.
close
(
)
;
}
)
;


创建集合

我们可以使用 createCollection() 方法来创建集合:

创建集合

var

MongoClient
=
require
(

mongodb

)
.
MongoClient
;
var

url
=

mongodb://localhost:27017/runoob

;
MongoClient
.
connect
(
url
,
function

(
err
,
db
)

{

if

(
err
)

throw

err
;
console
.
log
(

数据库已创建

)
;
var

dbase
=
db
.
db
(

runoob

)
;
dbase
.
createCollection
(

site

,
function

(
err
,
res
)

{

if

(
err
)

throw

err
;
console
.
log
(

创建集合!

)
;
db
.
close
(
)
;
}
)
;
}
)
;


数据库操作( CURD )

与 MySQL 不同的是 MongoDB 会自动创建数据库和集合,所以使用前我们不需要手动去创建。

插入数据

以下实例我们连接数据库 runoob 的 site 表,并插入一条数据条数据,使用 insertOne()

插入一条数据

var

MongoClient
=
require
(

mongodb

)
.
MongoClient
;
var

url
=

mongodb://localhost:27017/

;
MongoClient
.
connect
(
url
,
function
(
err
,
db
)

{

if

(
err
)

throw

err
;
var

dbo
=
db
.
db
(

runoob

)
;
var

myobj
=
{

name
:

菜鸟教程

,
url
:

www.runoob


}
;
dbo
.
collection
(

site

)
.
insertOne
(
myobj
,
function
(
err
,
res
)

{

if

(
err
)

throw

err
;
console
.
log
(

文档插入成功

)
;
db
.
close
(
)
;
}
)
;
}
)
;

执行以下命令输出就结果为:

$ node test.js
文档插入成功

从输出结果来看,数据已插入成功。

我们也可以打开 MongoDB 的客户端查看数据,如:

> show dbs
runoob  0.000GB          # 自动创建了 runoob 数据库
> show tables
site                     # 自动创建了 site 集合(数据表)
> db.site.find()
{ "_id" : ObjectId("5a794e36763eb821b24db854"), "name" : "菜鸟教程", "url" : "www.runoob" }
> 

如果要插入多条数据可以使用 insertMany()

插入多条数据

var

MongoClient
=
require
(

mongodb

)
.
MongoClient
;
var

url
=

mongodb://localhost:27017/

;
MongoClient
.
connect
(
url
,
function
(
err
,
db
)

{

if

(
err
)

throw

err
;
var

dbo
=
db
.
db
(

runoob

)
;
var

myobj
=
[

{

name
:

菜鸟工具

,
url
:

https://c.runoob.com

,
type
:

cn

}
,
{

name
:

Google

,
url
:

https://www.google.com

,
type
:

en

}
,
{

name
:

Facebook

,
url
:

https://www.google.com

,
type
:

en

}

]
;
dbo
.
collection
(

site

)
.
insertMany
(
myobj
,
function
(
err
,
res
)

{

if

(
err
)

throw

err
;
console
.
log
(

插入的文档数量为:

+
res
.
insertedCount
)
;
db
.
close
(
)
;
}
)
;
}
)
;

res.insertedCount 为插入的条数。

查询数据

可以使用 find() 来查找数据, find() 可以返回匹配条件的所有数据。 如果未指定条件,find() 返回集合中的所有数据。

find()

var

MongoClient
=
require
(

mongodb

)
.
MongoClient
;
var

url
=

mongodb://localhost:27017/

;
MongoClient
.
connect
(
url
,
function
(
err
,
db
)

{

if

(
err
)

throw

err
;
var

dbo
=
db
.
db
(

runoob

)
;
dbo
.
collection
(

site

)
.
find
(
{
}
)
.
toArray
(
function
(
err
,
result
)

{

//
返回集合中所有数据


if

(
err
)

throw

err
;
console
.
log
(
result
)
;
db
.
close
(
)
;
}
)
;
}
)
;

以下实例检索 name 为 “菜鸟教程” 的实例:

查询指定条件的数据

var

MongoClient
=
require
(

mongodb

)
.
MongoClient
;
var

url
=

mongodb://localhost:27017/

;
MongoClient
.
connect
(
url
,
function
(
err
,
db
)

{

if

(
err
)

throw

err
;
var

dbo
=
db
.
db
(

runoob

)
;
var

whereStr
=
{

name

:

菜鸟教程

}
;
//
查询条件


dbo
.
collection
(

site

)
.
find
(
whereStr
)
.
toArray
(
function
(
err
,
result
)

{

if

(
err
)

throw

err
;
console
.
log
(
result
)
;
db
.
close
(
)
;
}
)
;
}
)
;

执行以下命令输出就结果为:

[ { _id: 5a794e36763eb821b24db854,
    name: '菜鸟教程',
    url: 'www.runoob' } ]

更新数据

我们也可以对数据库的数据进行修改,以下实例将 name 为 “菜鸟教程” 的 url 改为 https://www.runoob.com:

更新一条数据

var

MongoClient
=
require
(

mongodb

)
.
MongoClient
;
var

url
=

mongodb://localhost:27017/

;
MongoClient
.
connect
(
url
,
function
(
err
,
db
)

{

if

(
err
)

throw

err
;
var

dbo
=
db
.
db
(

runoob

)
;
var

whereStr
=
{

name

:

菜鸟教程

}
;
//
查询条件


var

updateStr
=
{
$
set
:
{


url

:

https://www.runoob.com


}
}
;
dbo
.
collection
(

site

)
.
updateOne
(
whereStr
,
updateStr
,
function
(
err
,
res
)

{

if

(
err
)

throw

err
;
console
.
log
(

文档更新成功

)
;
db
.
close
(
)
;
}
)
;
}
)
;

执行成功后,进入 mongo 管理工具查看数据已修改:

> db.site.find().pretty()
{
    "_id" : ObjectId("5a794e36763eb821b24db854"),
    "name" : "菜鸟教程",
    "url" : "https://www.runoob.com"     // 已修改为 https
}

如果要更新所有符合条的文档数据可以使用 updateMany()

更新多条数据

var

MongoClient
=
require
(

mongodb

)
.
MongoClient
;
var

url
=

mongodb://localhost:27017/

;
MongoClient
.
connect
(
url
,
function
(
err
,
db
)

{

if

(
err
)

throw

err
;
var

dbo
=
db
.
db
(

runoob

)
;
var

whereStr
=
{

type

:

en

}
;
//
查询条件


var

updateStr
=
{
$
set
:
{


url

:

https://www.runoob.com


}
}
;
dbo
.
collection
(

site

)
.
updateMany
(
whereStr
,
updateStr
,
function
(
err
,
res
)

{

if

(
err
)

throw

err
;
console
.
log
(
res
.
result
.
nModified
+

条文档被更新

)
;
db
.
close
(
)
;
}
)
;
}
)
;

result.nModified 为更新的条数。

删除数据

以下实例将 name 为 “菜鸟教程” 的数据删除 :

删除一条数据

var

MongoClient
=
require
(

mongodb

)
.
MongoClient
;
var

url
=

mongodb://localhost:27017/

;
MongoClient
.
connect
(
url
,
function
(
err
,
db
)

{

if

(
err
)

throw

err
;
var

dbo
=
db
.
db
(

runoob

)
;
var

whereStr
=
{

name

:

菜鸟教程

}
;
//
查询条件


dbo
.
collection
(

site

)
.
deleteOne
(
whereStr
,
function
(
err
,
obj
)

{

if

(
err
)

throw

err
;
console
.
log
(

文档删除成功

)
;
db
.
close
(
)
;
}
)
;
}
)
;

执行成功后,进入 mongo 管理工具查看数据已删除:

> db.site.find()
> 

如果要删除多条语句可以使用 deleteMany() 方法

以下实例将 type 为 en 的所有数据删除 :

删除多条数据

var

MongoClient
=
require
(

mongodb

)
.
MongoClient
;
var

url
=

mongodb://localhost:27017/

;
MongoClient
.
connect
(
url
,
function
(
err
,
db
)

{

if

(
err
)

throw

err
;
var

dbo
=
db
.
db
(

runoob

)
;
var

whereStr
=
{

type
:

en


}
;
//
查询条件


dbo
.
collection
(

site

)
.
deleteMany
(
whereStr
,
function
(
err
,
obj
)

{

if

(
err
)

throw

err
;
console
.
log
(
obj
.
result
.
n
+

条文档被删除

)
;
db
.
close
(
)
;
}
)
;
}
)
;

obj.result.n 删除的条数。

排序

排序 使用 sort() 方法,该方法接受一个参数,规定是升序(1)还是降序(-1)。

例如:

{ type: 1 }  // 按 type 字段升序
{ type: -1 } // 按 type 字段降序

按 type 升序排列:

排序

var

MongoClient
=
require
(

mongodb

)
.
MongoClient
;
var

url
=

mongodb://localhost:27017/

;
MongoClient
.
connect
(
url
,
function
(
err
,
db
)

{

if

(
err
)

throw

err
;
var

dbo
=
db
.
db
(

runoob

)
;
var

mysort
=
{

type
:
1

}
;
dbo
.
collection
(

site

)
.
find
(
)
.
sort
(
mysort
)
.
toArray
(
function
(
err
,
result
)

{

if

(
err
)

throw

err
;
console
.
log
(
result
)
;
db
.
close
(
)
;
}
)
;
}
)
;

查询分页

如果要设置指定的返回条数可以使用 limit() 方法,该方法只接受一个参数,指定了返回的条数。

limit():读取两条数据

var

MongoClient
=
require
(

mongodb

)
.
MongoClient
;
var

url
=

mongodb://localhost:27017/

;
MongoClient
.
connect
(
url
,
function
(
err
,
db
)

{

if

(
err
)

throw

err
;
var

dbo
=
db
.
db
(

runoob

)
;
dbo
.
collection
(

site

)
.
find
(
)
.
limit
(
2
)
.
toArray
(
function
(
err
,
result
)

{

if

(
err
)

throw

err
;
console
.
log
(
result
)
;
db
.
close
(
)
;
}
)
;
}
)
;

如果要指定跳过的条数,可以使用 skip() 方法。

skip(): 跳过前面两条数据,读取两条数据

var

MongoClient
=
require
(

mongodb

)
.
MongoClient
;
var

url
=

mongodb://localhost:27017/

;
MongoClient
.
connect
(
url
,
function
(
err
,
db
)

{

if

(
err
)

throw

err
;
var

dbo
=
db
.
db
(

runoob

)
;
dbo
.
collection
(

site

)
.
find
(
)
.
skip
(
2
)
.
limit
(
2
)
.
toArray
(
function
(
err
,
result
)

{

if

(
err
)

throw

err
;
console
.
log
(
result
)
;
db
.
close
(
)
;
}
)
;
}
)
;

连接操作

mongoDB 不是一个关系型数据库,但我们可以使用 $lookup 来实现左连接。

例如我们有两个集合数据分别为:

集合1:orders

[
  { _id: 1, product_id: 154, status: 1 }
]

集合2:products

[
  { _id: 154, name: '笔记本电脑' },
  { _id: 155, name: '耳机' },
  { _id: 156, name: '台式电脑' }
]

$lookup 实现左连接

var

MongoClient
=
require
(

mongodb

)
.
MongoClient
;
var

url
=

mongodb://127.0.0.1:27017/

;
MongoClient
.
connect
(
url
,
function
(
err
,
db
)

{

if

(
err
)

throw

err
;
var

dbo
=
db
.
db
(

runoob

)
;
dbo
.
collection
(

orders

)
.
aggregate
(
[

{
$
lookup
:
{

from
:

products

,
//
右集合


localField
:

product_id

,
//
左集合 join 字段


foreignField
:

_id

,
//
右集合 join 字段


as
:

orderdetails


//
新生成字段(类型array)


}

}

]
)
.
toArray
(
function
(
err
,
res
)

{

if

(
err
)

throw

err
;
console
.
log
(
JSON
.
stringify
(
res
)
)
;
db
.
close
(
)
;
}
)
;
}
)
;

删除集合

我们可以使用 drop() 方法来删除集合:

drop()

var

MongoClient
=
require
(

mongodb

)
.
MongoClient
;
var

url
=

mongodb://localhost:27017/

;
MongoClient
.
connect
(
url
,
function
(
err
,
db
)

{

if

(
err
)

throw

err
;
var

dbo
=
db
.
db
(

runoob

)
;
//
删除 test 集合


dbo
.
collection
(

test

)
.
drop
(
function
(
err
,
delOK
)

{

//
执行成功 delOK 返回 true,否则返回 false


if

(
err
)

throw

err
;
if

(
delOK
)

console
.
log
(

集合已删除

)
;
db
.
close
(
)
;
}
)
;
}
)
;


使用 Promise

Promise 是一个 ECMAScript 6 提供的类,目的是更加优雅地书写复杂的异步任务。

如果你还不了解 Promise,可以参考 JavaScript Promise。

以下实例使用 Promise 创建集合:

实例

const

MongoClient
=
require
(

mongodb

)
.
MongoClient
;
const

url
=

mongodb://localhost/runoob

;
MongoClient
.
connect
(
url
)
.
then
(
(
conn
)
=>
{

console
.
log
(

数据库已连接

)
;
var

dbase
=
conn
.
db
(

runoob

)
;
dbase
.
createCollection
(

site

)
.
then
(
(
res
)
=>
{

console
.
log
(

已创建集合

)
;
}
)
.
catch
(
(
err
)
=>
{

console
.
log
(

数据库操作错误

)
;
}
)
.
finally
(
(
)
=>
{

conn
.
close
(
)
;
}
)
;
}
)
.
catch
(
(
err
)
=>
{

console
.
log
(

数据库连接失败

)
;
}
)
;

Promise 数据操作

现在我们在一个程序中实现四个连续操作:增加 、查询 、更改 、删除。

实例

const

MongoClient
=
require
(

mongodb

)
.
MongoClient
;
const

url
=

mongodb://localhost/

;
MongoClient
.
connect
(
url
)
.
then
(
(
conn
)
=>
{

console
.
log
(

数据库已连接

)
;
const

test
=
conn
.
db
(

testdb

)
.
collection
(

test

)
;
//
增加


test
.
insertOne
(
{


site

:

runoob.com


}
)
.
then
(
(
res
)
=>
{

//
查询


return

test
.
find
(
)
.
toArray
(
)
.
then
(
(
arr
)
=>
{

console
.
log
(
arr
)
;
}
)
;
}
)
.
then
(
(
)
=>
{

//
更改


return

test
.
updateMany
(
{


site

:

runoob.com


}
,
{
$
set
:
{


site

:

example.com


}

}
)
;
}
)
.
then
(
(
res
)
=>
{

//
查询


return

test
.
find
(
)
.
toArray
(
)
.
then
(
(
arr
)
=>
{

console
.
log
(
arr
)
;
}
)
;
}
)
.
then
(
(
)
=>
{

//
删除


return

test
.
deleteMany
(
{


site

:

example.com


}
)
;
}
)
.
then
(
(
res
)
=>
{

//
查询


return

test
.
find
(
)
.
toArray
(
)
.
then
(
(
arr
)
=>
{

console
.
log
(
arr
)
;
}
)
;
}
)
.
catch
(
(
err
)
=>
{

console
.
log
(

数据操作失败

+
err
.
message
)
;
}
)
.
finally
(
(
)
=>
{

conn
.
close
(
)
;
}
)
;
}
)
.
catch
(
(
err
)
=>
{

console
.
log
(

数据库连接失败

)
;
}
)
;

执行结果:

数据库已连接
[ { _id: 5f1664966833e531d83d3ac6, site: 'runoob.com' } ]
[ { _id: 5f1664966833e531d83d3ac6, site: 'example.com' } ]
[]

用异步函数实现相同的数据操作

实例

const

MongoClient
=
require
(

mongodb

)
.
MongoClient
;
const

url
=

mongodb://localhost/

;
async

function

dataOperate
(
)

{

var

conn
=
null
;
try

{

conn
=
await

MongoClient
.
connect
(
url
)
;
console
.
log
(

数据库已连接

)
;
const

test
=
conn
.
db
(

testdb

)
.
collection
(

test

)
;
//
增加


await

test
.
insertOne
(
{


site

:

runoob.com


}
)
;
//
查询


var

arr
=
await

test
.
find
(
)
.
toArray
(
)
;
console
.
log
(
arr
)
;
//
更改


await

test
.
updateMany
(
{


site

:

runoob.com


}
,
{
$
set
:
{


site

:

example.com


}

}
)
;
//
查询


arr
=
await

test
.
find
(
)
.
toArray
(
)
;
console
.
log
(
arr
)
;
//
删除


await

test
.
deleteMany
(
{


site

:

example.com


}
)
;
//
查询


arr
=
await

test
.
find
(
)
.
toArray
(
)
;
console
.
log
(
arr
)
;
}

catch

(
err
)

{

console
.
log
(

错误:

+
err
.
message
)
;
}

finally

{

if

(
conn
!=
null
)

conn
.
close
(
)
;
}

}

dataOperate
(
)
;

运行结果:

数据库已连接
[ { _id: 5f169006a2780f0cd4ea640b, site: 'runoob.com' } ]
[ { _id: 5f169006a2780f0cd4ea640b, site: 'example.com' } ]
[]

运行结果完全一样。

很显然,异步函数是一种非常良好的编程风格,在多次使用异步操作的时候非常实用。

但是请勿在低于 7.6.0 版本的 node.js 上使用异步函数。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/243081.html<

(0)
管理的头像管理
上一篇2025-04-25 02:40
下一篇 2025-04-25 02:41

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注