JavaScript >> Javascript 文檔 >  >> Node.js

使用 Node.js 對 MongoDB 進行入門級介紹

簡介

在本文中,我們將討論如何將 MongoDB 數據庫與 Node.js 一起使用。有幾種方法可以做到這一點,包括一種流行的方法 - 使用 對象建模庫 . Mongoose 是 Node.js 中此類庫的一個示例,但是,我們將使用 Node.js 的官方 MongoDB 驅動程序。

在本文中,我們將連接到 MongoDB 服務器,創建文檔,從數據庫中檢索它們,最後刪除一些。

這將通過幾個腳本來完成,儘管您通常會將它們與 Web 服務器/應用程序集成,而不是將它們放在獨立的腳本中。

什麼是 MongoDB?

MongoDB 是一個跨平台(在多個操作系統上運行)、面向文檔的數據庫管理系統 (數據庫管理系統)。 MongoDB也是一個NoSQL數據庫,這意味著它不使用SQL對數據庫進行操作。

MongoDB 使用類似 JSON 格式的文檔,稱為 BSON,它是 JSON 的二進制編碼。

它是 MongoDB Inc. 在 Server Side Public License 下開發的一個開源項目 .

Node 和 MongoDB 可以很好地協同工作,部分原因是 Mongo 使用了內置在數據庫中的 JavaScript 引擎,因為 JavaScript 擅長處理 JSON 對象。

與 MySQL 等其他數據庫相比,MongoDB 存儲某些類型的數據速度快,並且可以自動擴展。實現和運行非常簡單。

Mongo 是一個 NoSQL 數據庫,它有自己的數據存儲方式。以下是構成數據庫結構的一些結構:

  1. 數據庫 :包含一組集合的容器。
  2. 收藏 :一組文件。這類似於 SQL 數據庫中的表。但是,與 SQL 數據庫不同的是,集合沒有固定的結構或預配置的數據類型。
  3. 文件 :一個類似 JSON 的對象。這類似於 SQL 數據庫中的一行。 JSON 對像還可能包含子對象、數組等。
  4. _id :每個文檔中的強制性唯一字段。它將一個文檔與另一個文檔分開,因此我們可以獨立識別每個文檔。如果未提供此值,MongoDB 會自動為該字段分配一個隨機值。

項目配置

讓我們從項目開始,跳過 npm 提示:

$ npm init -y

然後,我們安裝官方的 MongoDB 驅動:

$ npm install --save mongodb

為了實際連接到數據庫,您需要確保您的 MongoDB 服務正在後台或您的開發機器中運行。運行命令 mongo 在你的命令提示符下進入 Mongo shell:

運行命令 show dbs; 將顯示當前數據庫的列表:

您可以通過運行 exit 退出 shell 命令。

與需要在使用前創建數據庫的 SQL 數據庫不同 - 無需事先創建數據庫或集合。它們會在需要時自動創建。

實現 CRUD 操作

初始化項目並安裝 MongoDB 後,我們可以開始編寫一些 CRUD 邏輯。

連接數據庫

當然,要在代碼中使用 MongoDB,我們需要導入模塊:

const mongodb = require('mongodb');

然後,讓我們實例化一個客戶端:

const MongoClient = mongodb.MongoClient;

客戶端需要知道在哪裡連接,所以我們將提供一個 urldbName

// Connection URL
const url = 'mongodb://localhost:27017';

// Database Name
const dbName = 'userdb';

最後,讓我們嘗試連接數據庫:

// Use the connect method to create a connection w/ the database
MongoClient.connect(url, (err, client) => {
    if (err) {
        throw err;
        return;
    }

    console.log('Database connection successful');

    // This objects holds the refrence to the db
    const db = client.db(dbName);

    client.close();
});

如果您已成功連接到數據庫,您應該會看到輸出:

Database connection successful

否則,您將收到一條錯誤消息。檢查服務器是否啟動並運行,在這種情況下用戶名和密碼是否正確。

正如您在示例中看到的那樣,MongoClient.connect 方法有兩個參數,數據庫的URL和回調函數。

回調函數有兩個參數:errclient .

如果存在任何網絡問題或連接到數據庫的任何其他問題,第一個參數將包含錯誤。如果沒有問題,錯誤將是 null .

第二個參數是客戶端對象,我們用來和數據庫交互。

db client 的屬性 保存對數據庫的引用。要對該數據庫執行任何操作,我們使用此引用。

創建文檔

顯然,要對數據庫執行任何操作,您必須連接到它。使用 Mongo,有兩種方法可以將文檔插入數據庫。第一種方法是添加 一次記錄。我們可以使用 insertOne() 實現方法:

const collection = db.collection('userdb');

// Insert one document
collection.insertOne({
    firstName: 'john',
    lastName: 'doe',
    age: 21,
    hobbies: [
        'Reading books',
        'Collecting stamps'
    ]
}, (err, result) => {
    if (err) {
        console.log(err);
        return;
    }
    
    console.log(result.result);
});

回調的結果參數包含有關查詢的信息。它有一個名為 result 的字段 看起來像:

result: { n: 1, ok: 1 }

n 是插入的文檔數。 ok 是命令的狀態。

您不必明確 創建一個名為 userdb 的數據庫 ,或名為 users 的集合 在插入文檔之前。將自動創建數據庫和集合。

第二種方法允許您添加 multiple 文件。我們可以使用 insertMany() 實現方法:

免費電子書:Git Essentials

查看我們的 Git 學習實踐指南,其中包含最佳實踐、行業認可的標準以及隨附的備忘單。停止谷歌搜索 Git 命令並真正學習 它!

// Insert multiple documents
collection.insertMany([
    {
        firstName: 'john',
        lastName: 'doe',
        age: 21,
        hobbies: [
            'Reading books',
            'Collecting stamps'
        ]
    }, {
        firstName: 'anna',
        lastName: 'dias',
        age: 20,
        hobbies: []
    }
], (err, result) => {
    if (err) {
        console.log(err);
        return;
    }
    
    console.log(result.ops);
});

運行這段代碼會產生:

[ { _id: 1,
    firstName: 'john',
    lastName: 'doe',
    age: 21,
    hobbies: [ 'Reading books', 'Collecting stamps' ] },
  { _id: 2,
    firstName: 'anna',
    lastName: 'dias',
    age: 20,
    hobbies: [] } ]

由於我們還沒有定義 _id 對於這些文檔中的任何一個,我們都可以獲取分配的 _id 來自 result['ops'] 如果我們需要訪問生成的 _id 對象 .

除此之外,您還可以定義 _id 你自己:

// Insert one document
collection.insertOne({
    _id: 'someuniqueid',    // Our specified ID
    firstName: 'john',
    lastName: 'doe',
    age: 21,
    hobbies: [
        'Reading books',
        'Collecting stamps'
    ]
}, (err, result) => {
    if (err) {
        console.log(err);
        return;
    }
    
    console.log(result.result);
});

檢索文檔

檢索所有文檔

首先,讓我們看看如何從一個集合中獲取所有文檔:

// Find all documents
collection.find({}).toArray((err, docs) => {
    if (err) {
        throw err;
    }
    console.log(docs)
});

運行這段代碼將產生我們:

[{ _id: 1,
    firstName: 'john',
    lastName: 'doe',
    age: 21,
    hobbies: [ 'Reading books', 'Collecting stamps' ] },
  { _id: 2,
    firstName: 'anna',
    lastName: 'dias',
    age: 20,
    hobbies: [] } ]

正如您在示例中看到的,我們傳遞了一個空對象 ({} ) 作為查詢。

根據文檔, toArray() 方法返回一個數組,其中包含來自游標的所有文檔。該方法完全迭代游標,將所有文檔加載到RAM中並耗盡游標。

集合獲取的文檔將分配給 docs 回調函數中的參數。

使用查詢過濾器查找文檔

查找文檔的下一個方法是使用查詢過濾器。例如,以下查詢選擇名字為 john 的用戶 :

{
    'firstName': 'john'
}

並在代碼中做到這一點:

collection.find({
    firstName: 'john'
}).toArray((err, docs) => {
    if (err) {
        throw err;
    }
    console.log(docs)
});

此代碼將導致:

[{ _id: 1,
    firstName: 'john',
    lastName: 'doe',
    age: 21,
    hobbies: [ 'Reading books', 'Collecting stamps' ] } ]

顯然,所有帶有 firstName 的記錄 john 被退回。

更新文檔

我們要討論的下一個操作是更新文檔。要更新單個文檔,類似於檢索文檔,我們可以使用 updateOne() 方法:

collection.updateOne(
    // The query filter
    {
        firstName: 'john'
    },
    // The update values
    {
        $set: {
            lastName: 'well',
            edited: true
        }
    },
    (err, result) => {
        if (err) {
            throw err;
        }
        console.log(result.result);
    }
);

此代碼導致:

{ n: 1, nModified: 1, ok: 1 }

正如您在示例中看到的,updateOne() 方法接受三個參數。第一個是查詢過濾器。第二個是更新值。第三個是回調函數,接受錯誤和結果作為參數。

同樣,這裡的結果通知我們狀態(ok ),為更新選擇的文檔數 (n ) 和更新文檔的數量 (nModified )。

n 可以大於 nModified , 如果一個字段更新為它已有的值。

使用此查詢,我們選擇了一個文檔,其中字段 firstNamejohn 我們已經更改了 lastName 該文檔的 well .此外,我們還添加了一個名為 edited 的字段 並將其設置為 true .請注意,在整個過程中我們不需要指定或遵循任何模式。 Mongo 只接受你發送給它的任何數據。

如果您使用的是 updateOne() 方法,查詢將選擇第一個具有匹配字段的文檔。如果有多個文檔具有相同值的字段,則使用 updateMany() 方法會全部更新,這在某些情況下可能不是我們想要做的。

注意 :如果您使用的是 updateOne() 方法,理想情況下查詢應該只選擇一個文檔。否則,我們無法預測可能會更新的文檔。所以請記住這一點,在使用可以匹配多個文檔的查詢過濾器時要小心。

我們也可以編輯所有滿足firstName字段條件的文檔 是 john

collection.updateMany(
    // The query filter
    {
        firstName: 'john'
    },
    // The update values
    {
        $set: {
            lastName: 'well',
            edited: true
        }
    },
    (err, result) => {
        if (err) {
            throw err;
        }
        console.log(result.result);
    }
);

updateMany() 方法類似於 updateOne() 方法,除了它更新 all 匹配查詢過濾器的文檔。

刪除文檔

我們可以使用 deleteOne()deleteMany() 從集合中刪除文檔的方法:

collection.deleteOne(
    // The query filter
    {
        firstName: 'john'
    },
    (err, result) => {
        if (err) {
            throw err;
        }
        console.log(result.result);
    }
);

此代碼導致:

{ n: 1, ok: 1 }

同樣,與前面的示例類似——第一個接受的參數是過濾器查詢,第二個參數是回調函數。回調函數返回錯誤或結果。

運行這段代碼將刪除一個與查詢匹配的文檔——在這種情況下,一個包含 firstName 的文檔 字段為 john .同樣,這只會刪除 first 與查詢匹配的文檔。

您也可以使用 deleteMany 刪除所有選中文檔的方法:

collection.deleteMany(
    // The query filter
    {
        firstName: 'john'
    },
    (err, result) => {
        if (err) {
            throw err;
        }
        console.log(result.result);
    }
);

結論

MongoDB 是一種流行的 NoSQL 輕量級數據庫,非常容易實現和使用 Node.js。我們編寫了一個非常簡單的 Node 應用程序,它與 MongoDB 交互以創建、檢索和刪除集合。

與往常一樣,源代碼在 GitHub 上可用。


Tutorial JavaScript 教程
  1. 從命令行啟動快速 http 開發服務器的指南(Python、Node、Ruby、PHP)

  2. 阿波羅聯盟和網關入門

  3. 等待函數,但讓它們同步,然後調用最後一個函數

  4. 撲熱息痛.js💊| #39:解釋這段 JavaScript 代碼

  5. 使用 PixiJS 生成或動畫 Chrome 擴展圖標

  6. 在 Sublime Text 下獲得完整的 JS 自動補全

  7. 5 分鐘 TypeScript NPM 包

  1. Vue 觀察者與計算屬性

  2. JSON Web 令牌 (JWT) 如何保護您的 API

  3. 純組件、接口和邏輯掛鉤。

  4. Auth 在使用 AWS 的 React 應用程序中如何工作?

  5. Javascript中的方法重載

  6. 上下文 API 問題 – 對象未定義

  7. 如何使用 useEffect React hook 🎈

  1. Web 3.0 終極指南 - 在學習 Web 3.0 之前你需要知道的一切

  2. React Router 教程:為你的 React 應用添加導航

  3. 尋找火箭聯盟的最佳相機設置。

  4. 像 Web 開發人員一樣思考