SQL Node Mongodb

Node操作原生mongodb模块

Posted on 03-14 2020,9 min read

Node操作原生mongodb模块


Organized by安南 City

Completion time2020-03-14

Send error to emailcity@nanzc.com


MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

Node原生的MongoDB驱动:mongodb模块

 

安装驱动


在当前项目安装mongodb驱动模块

npm install mongodb

 

连接数据库


首先创建一个MongoClient对象,然后配置好地址端口以及数据库 ,默认端口可省略。

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

const MongoClient = require("mongodb").MongoClient;
// mongodb://host:port/db
MongoClient.connect('mongodb://localhost:27017/stu', { useNewUrlParser: true, useUnifiedTopology: true }, (err, db) => {
    if (err) throw err; // 如果发生错误,抛出错误
    console.log("连接成功");
    // 关闭数据库
    db.close();
})

 

创建集合


createCollection():创建一个集合。

在未创建集合的情况下使用集合,集合将会自动创建。

const MongoClient = require("mongodb").MongoClient;

// 如果数据库不存在,将会隐式创建
MongoClient.connect("mongodb://localhost/blog", { useNewUrlParser: true, useUnifiedTopology: true }, (err, db) => {
    if (err) throw err; // 如果发生错误,抛出错误

    // 选择数据库 blog
    let dbase = db.db("blog");

    // 主动创建集合
    dbase.createCollection("filing", (err, res) => {
        if (err) throw err;
        
        console.log("创建集合");
        
        // 关闭数据库
        db.close();
    })
})

 

删除集合


collection():选择集合。

drop:删除集合。

const MongoClient = require("mongodb").MongoClient;

MongoClient.connect("mongodb://localhost/blog", { useNewUrlParser: true, useUnifiedTopology: true }, (err, db) => {
    if (err) throw err;

    // 选择数据库 blog
    let dbase = db.db("blog");

    // collection()选择集合,drop()删除集合
    dbase.collection("filing").drop((err, delOK) => {
        if (err) throw err;

        if (delOK) console.log("集合已删除");

        db.close();
    })
})

 

数据库操作( CURD )


接下来我们将学习数据库的增删改查操作。

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

 

插入文档


insertOne({insert data}, callback):插入一条数据

const MongoClient = require("mongodb").MongoClient;

MongoClient.connect("mongodb://localhost/blog", { useNewUrlParser: true, useUnifiedTopology: true }, (err, db) => {
    if (err) throw err;
	let dbase = db.db("blog");

    let insertData = { name: "南之城", url: "nanzc.com", rank: "1" };
    dbase.collection("filing").insertOne(insertData, (err, res) => {
        if (err) throw err;
        
        console.log("插入文档成功");

        db.close();
    })
})

insertOne([{insert data},...], callback):插入多条数据

const MongoClient = require("mongodb").MongoClient;

MongoClient.connect("mongodb://localhost/blog", { useNewUrlParser: true, useUnifiedTopology: true }, (err, db) => {
    if (err) throw err;
    let dbase = db.db("blog");

    let insData = [
        { name: "南之城", url: "nanzc.com", rank: "3" },
        { name: "百度", url: "baidu.com", rank: "5" },
        { name: "南之城", url: "nanzc.com", rank: "1" },
        { name: "谷歌", url: "google.com", rank: "4" },
        { name: "谷歌", url: "google.com", rank: "2" }
    ];
    dbase.collection("filing").insertMany(insData, (err, res) => {
        if (err) throw err;
        
        console.log("插入的文档数量为: ", res.insertedCount);

        db.close();
    })
})

 

查询文档


find({ }):查询文档,返回匹配条件的所有文档

const MongoClient = require("mongodb").MongoClient;

MongoClient.connect("mongodb://localhost/blog", { useNewUrlParser: true, useUnifiedTopology: true }, (err, db) => {
    if (err) throw err;
    let dbase = db.db("blog");

    // 查询所有文档,不指定条件即可
    dbase.collection("filing").find({}).toArray((err, res) => {
        if (err) throw err;
        
        console.log("查询所有文档:", res);
        
        // db.close();
    })

    // 查询指定条件文档
    dbase.collection("filing").find({ name: "南之城" }).toArray((err, res) => {
        if (err) throw err;
        
        console.log("指定条件文档:", res);
        
        // db.close();
    })
})

 

更新文档


updateOne({ }, {$: { }}, callback):更新一条文档

updateMany({ }, {$: { }}, callback):更新符合条件的所有文档

update:需要包含原子操作符,如$set

https://www.runoob.com/mongodb/mongodb-atomic-operations.html(参考)

const MongoClient = require("mongodb").MongoClient;

MongoClient.connect("mongodb://localhost/blog", { useNewUrlParser: true, useUnifiedTopology: true }, (err, db) => {
    if (err) throw err;
    let dbase = db.db("blog");

    // 只会更新一条文档
    dbase.collection("filing").updateOne({ name: "南之城" }, { $set: { url: "www.nanzc.com" } }, (err, res) => {
        if (err) throw err;
        
        console.log("文档更新成功");
        
        // db.close();
    })

    // 更新符合条件的所有数据
    dbase.collection("filing").updateMany({ name: "谷歌" }, { $set: { url: "www.google.com" } }, (err, res) => {
        if (err) throw err;
        
        console.log(res.result.nModified + " 条文档被更新");
        
        // db.close();
    });
})

 

删除文档


deleteOne({ }, callback):删除一条文档

deleteMany({ }, callback):删除符合条件的所有文档

const MongoClient = require("mongodb").MongoClient;

MongoClient.connect("mongodb://localhost/blog", { useNewUrlParser: true, useUnifiedTopology: true }, (err, db) => {
    if (err) throw err;
    let dbase = db.db("blog");

    // 删除一条文档
    dbase.collection("site").deleteOne({ name: "谷歌" }, (err, obj) => {
        if (err) throw err;
        
        console.log("文档删除成功");
        
        // db.close();
    });

    // 删除符合条件所有文档
    dbase.collection("site").deleteMany({ name: "谷歌" }, (err, obj) => {
        if (err) throw err;
        
        console.log(obj.result.n + " 条文档被删除");
        
        /// db.close();
    });
})

 

数据库功能


接下来介绍数据库功能性操作API

 

排序


sort({ }):将数据排序

{fieldName: 1/-1}:排序方式,升序1,降序-1

const MongoClient = require("mongodb").MongoClient;

MongoClient.connect("mongodb://localhost/blog", { useNewUrlParser: true, useUnifiedTopology: true }, (err, db) => {
    if (err) throw err;
    let dbase = db.db("blog");

    // { rank: 1 }  // 按 rank 字段升序
    // { rank: -1 } // 按 rank 字段降序
    dbase.collection("filing").find().sort({ rank: 1 }).toArray((err, result) => {
        if (err) throw err;
        
        console.log(result);

        db.close();
    })
})

 

查询分页


limit(num: Number):指定的返回条数

skip(num: Number):指定的跳过条数

const MongoClient = require("mongodb").MongoClient;

MongoClient.connect("mongodb://localhost/blog", { useNewUrlParser: true, useUnifiedTopology: true }, (err, db) => {
    if (err) throw err;

    let dbase = db.db("blog");

    // 指定的返回条数
    dbase.collection("filing").find().limit(2).toArray((err, result) => {
        if (err) throw err;

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

    // 返回跳过2条后的2条数据
    dbase.collection("filing").find().skip(2).limit(2).toArray((err, result) => {
        if (err) throw err;

        console.log(result);

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

 

左连接


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

假设我们有两个集合:

orders

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

products

[
{ _id: 154, name: '笔记本电脑' },
{ _id: 155, name: '耳机' },
{ _id: 156, name: '台式电脑' }
]
const MongoClient = require("mongodb").MongoClient;

MongoClient.connect("mongodb://localhost/blog", { useNewUrlParser: true, useUnifiedTopology: true }, (err, db) => {
    if (err) throw err;
    let dbase = db.db("blog");

    // 操作左集合
    dbase.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));
        // [{"_id":1,"product_id":154,"status":1,"orderdetails":[{"_id":154,"name":"笔记本电脑"}]}]

        db.close();
    });
})

 

推荐使用Mongoose


原由: 让我们面对这样的困境,编写MongoDB验证,转换和业务逻辑是非常麻烦的

Mongoose:为模型提供了一种直接的,基于scheme结构去定义你的数据模型。它内置数据验证, 查询构建,业务逻辑钩子等,开箱即用。

side: http://www.mongoosejs.net/

 

下一篇: 计算机原理