树叶云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

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

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