NoSQL 数据库(MongoDB)

1. 简介

1.1 什么是 NoSQL 数据库?

NoSQL(Not Only SQL)数据库是一种非关系型数据库,它不使用传统的表格结构来存储数据,而是使用各种不同的数据模型,如文档、键值对、列族和图形等。NoSQL 数据库通常用于处理大量数据和高并发访问的场景。

1.2 MongoDB 概述

MongoDB 是一个开源的、基于文档的 NoSQL 数据库。它使用 JSON 格式的文档来存储数据,支持动态查询、索引、复制和分片等功能。MongoDB 非常适合用于处理结构化和半结构化数据。

2. 安装和配置 MongoDB

2.1 安装 MongoDB

在开始使用 MongoDB 之前,首先需要在你的系统上安装 MongoDB。以下是安装步骤:

2.1.1 在 macOS 上安装 MongoDB

brew install mongodb-community

2.1.2 在 Ubuntu 上安装 MongoDB

sudo apt-get install -y mongodb

2.2 启动 MongoDB 服务

安装完成后,启动 MongoDB 服务:

sudo systemctl start mongodb

2.3 配置 MongoDB

MongoDB 的配置文件通常位于 /etc/mongod.conf。你可以根据需要修改配置文件,例如设置数据存储路径、绑定 IP 地址等。

3. 使用 MongoDB 的 Node.js 驱动

3.1 安装 MongoDB Node.js 驱动

在 Node.js 项目中使用 MongoDB,首先需要安装 MongoDB 的 Node.js 驱动:

npm install mongodb

3.2 连接到 MongoDB

使用 MongoDB 驱动连接到数据库:

const { MongoClient } = require('mongodb');

const uri = 'mongodb://localhost:27017';
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });

async function connect() {
    try {
        await client.connect();
        console.log('Connected to MongoDB');
    } catch (err) {
        console.error('Error connecting to MongoDB:', err);
    }
}

connect();

3.3 创建数据库和集合

连接成功后,可以创建数据库和集合:

const db = client.db('mydatabase');
const collection = db.collection('mycollection');

3.4 插入文档

向集合中插入文档:

const document = { name: 'John Doe', age: 30 };
const result = await collection.insertOne(document);
console.log('Document inserted with id:', result.insertedId);

3.5 查询文档

从集合中查询文档:

const query = { name: 'John Doe' };
const documents = await collection.find(query).toArray();
console.log('Found documents:', documents);

3.6 更新文档

更新集合中的文档:

const filter = { name: 'John Doe' };
const update = { $set: { age: 31 } };
const result = await collection.updateOne(filter, update);
console.log('Documents updated:', result.modifiedCount);

3.7 删除文档

从集合中删除文档:

const filter = { name: 'John Doe' };
const result = await collection.deleteOne(filter);
console.log('Documents deleted:', result.deletedCount);

4. 实践练习

4.1 创建一个简单的博客系统

使用 MongoDB 和 Node.js 创建一个简单的博客系统,包含以下功能:

  • 用户注册和登录
  • 创建、编辑和删除博客文章
  • 查看博客文章列表

4.2 代码示例

以下是一个简单的博客系统示例代码:

const express = require('express');
const { MongoClient } = require('mongodb');
const app = express();
const port = 3000;

const uri = 'mongodb://localhost:27017';
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });

app.use(express.json());

app.post('/register', async (req, res) => {
    const { username, password } = req.body;
    const db = client.db('blog');
    const users = db.collection('users');
    const result = await users.insertOne({ username, password });
    res.json({ message: 'User registered', id: result.insertedId });
});

app.post('/login', async (req, res) => {
    const { username, password } = req.body;
    const db = client.db('blog');
    const users = db.collection('users');
    const user = await users.findOne({ username, password });
    if (user) {
        res.json({ message: 'Login successful' });
    } else {
        res.status(401).json({ message: 'Invalid credentials' });
    }
});

app.post('/posts', async (req, res) => {
    const { title, content } = req.body;
    const db = client.db('blog');
    const posts = db.collection('posts');
    const result = await posts.insertOne({ title, content });
    res.json({ message: 'Post created', id: result.insertedId });
});

app.get('/posts', async (req, res) => {
    const db = client.db('blog');
    const posts = db.collection('posts');
    const allPosts = await posts.find().toArray();
    res.json(allPosts);
});

app.listen(port, async () => {
    await client.connect();
    console.log(`Blog app listening at http://localhost:${port}`);
});

5. 总结

通过本教程,你已经学习了如何安装和配置 MongoDB,以及如何使用 MongoDB 的 Node.js 驱动进行基本的数据库操作。我们还通过一个简单的博客系统示例,展示了如何在实际项目中使用 MongoDB。希望你能继续深入学习 MongoDB 的高级功能,如索引、聚合、复制和分片等。