JavaScript >> Javascript 文檔 >  >> JavaScript

迷彩入門

簡介

首先,Camo 是一個新的基於類的 ES6 ODM,用於 MongoDB 和 Node。隨著主流 ES6 迅速接近我們,我認為我們早就應該使用利用新功能的 ODM,所以我創建了 Camo。從 Java 過渡到 JavaScript 編程時,最困擾我的是缺乏傳統樣式的類。我認為尤其是對於初學者來說,這是任何 ODM 都必須具備的重要功能。

在本教程中,我將向您展示如何使用 Camo 的基本功能(模式聲明、保存、加載等)。為了更容易與 Mongoose 進行比較,我將展示與 Mongoose 入門文章類似的示例。希望您可以從這裡決定您最喜歡在您的項目中使用的樣式/功能。

將 Camo 連接到 MongoDB

注意 :本文代碼使用v0.12.1 迷彩。

要將 Camo 連接到您的數據庫,只需傳遞連接字符串(通常格式為 mongodb://[ip-address]/[db-name] ) 到 connect() 方法,它將返回一個 Camo 客戶端的實例。客戶端實例可用於配置數據庫,但不需要聲明、保存或刪除文檔。

var connect = require('camo').connect;
 
var database;
var uri = 'mongodb://localhost/test';
connect(uri).then(function(db) {
    database = db;
});

架構和模型

模型使用 ES6 類聲明並且必須擴展 Document 目的。模型的模式在構造函數中聲明,任何不以下劃線開頭的成員變量 (_ ) 包含在架構中並保存到數據庫中。成員變量可以通過直接分配類型來聲明,也可以通過為它分配帶有選項的對象來聲明。

var Document = require('camo').Document;
 
class Movie extends Document {
    constructor() {
        super();

        this.title = String;
        this.rating = {
            type: String,
            choices: ['G', 'PG', 'PG-13', 'R']
        };
        this.releaseDate = Date;
        this.hasCreditCookie = Boolean;
    }

    static collectionName() {
        return 'movies';
    }
}

通過覆蓋靜態 collectionName() 來聲明集合名稱 方法。雖然在代碼中很少需要這個名稱,但是在手動檢查 MongoDB 數據庫時它會變得很有用,所以最好保持它與模型名稱相關。

如果 collectionName() 沒有提供,那麼Camo會根據類名自動分配一個集合名。

創建、檢索、更新和刪除 (CRUD)

要創建模型的實例,只需使用 create() 方法,它為您處理大部分實例化工作。可選地,可以將數據傳遞給 create() 將分配給成員變量。如果未為變量傳遞數據,則為其分配默認值(如果在架構中指定),或分配 null .

var thor = Movie.create({
    title: 'Thor',
    rating: 'PG-13',
    releaseDate: new Date(2011, 4, 2),
    hasCreditCookie: true
});

thor.save().then(function(t) {
    console.log(thor);
});

保存實例時,如果之前沒有保存過的數據將被插入到數據庫中。如果實例已經保存到數據庫中,則現有文檔會根據更改進行更新。

要刪除文檔,只需調用 delete 方法就可以了。您也可以使用靜態 deleteOne() , deleteMany() , 或 findOneAndDelete() 在模型類上。 Promise內會返回從數據庫中刪除的文檔數 .

thor.delete().then(function(numDeleted) {
    console.log(numDeleted);
});

要從數據庫加載文檔,您有幾個選擇,具體取決於您要執行的操作。選項有:

  • findOne() 用於加載單個文檔(如果不存在則為 null)
// Load only the 'Thor' movie
Movie.findOne({ title: 'Thor' }).then(function(movie) {
	console.log(thor);
});
  • find() 用於加載多個文檔(如果不存在,則為空數組)

免費電子書:Git Essentials

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

// Load all movies that have a credit cookie
Movie.find({ hasCreditCookie: true }).then(function(movies) {
    console.log(thor);
});
  • findOneAndUpdate() 用於檢索文檔並在單個原子操作中更新它
// Update 'Thor' to have a rating of 'R'
Movie.findOneAndUpdate({ title: 'Thor' }, { rating: 'R' }).then(function(movies) {
    console.log(thor);
});

其他

由於 Camo 對 ES6 類的支持,我們可以輕鬆地為模型定義靜態、虛擬和方法,這使得模型代碼更有條理和可讀性。

var Document = require('camo').Document;
 
class Movie extends Document {
    constructor() {
        super();

        // Schema declaration here...
    }

    set releaseYear(year) {
        this.releaseDate.setYear(year);
    }

    get releaseYear() {
        return this.releaseDate.getFullYear();
    }

    yearsOld() {
        return new Date().getFullYear() - this.releaseDate.getFullYear();
    }

    static findAllRMovies() {
        return this.find({ rating: 'R' });
    }
}

var uri = 'nedb://memory';

connect(uri).then(function(db) {
    var thor = Movie.create({
        title: 'The Matrix',
        rating: 'R',
        releaseDate: new Date(1999, 2, 31),
        hasCreditCookie: true
    });
    
    return thor.save();
}).then(function(t) {
    return Movie.findAllRMovies();
}).then(function(movies) {
    movies.forEach(function(m) {
        console.log(m.title + ': ' + m.releaseDate.getFullYear());
    });
});

除了與 MongoDB 的接口,Camo 還支持 NeDB,它類似於 SQLite,相當於 Mongo。上面顯示了使用 NeDB 的示例。在開發和測試期間使用它非常有幫助,因為數據可以存儲在文件中或僅存儲在內存中。這也意味著你可以在前端瀏覽器代碼中使用Camo!

前往項目頁面了解更多信息。就像你看到的那樣?為項目加註星標並傳播信息!


Tutorial JavaScript 教程
  1. 使用 Angular 和 .NET 的 gRPC-Web 完整指南

  2. text/javascript 和 application/javascript 有什麼區別

  3. Javascript - 數組中的 forEach 與 map 方法

  4. 我如何構建公告通知器應用程序

  5. 索環文檔

  6. 在 JS 中克隆對象的陷阱🕳️(使用 Object.assign 和對像傳播)

  7. 狀態機也適用於邏輯

  1. 反應鉤絆線

  2. Node.js 中的導出與 module.exports

  3. 使用 Next.js 8 和 Zeit Now 構建和部署無服務器 React 應用程序

  4. 集成 React 和 GraphQL 的快速指南

  5. 為什麼我創建了另一個版本控制工具以及我從中學到了什麼

  6. Electron 遇到 Vue.js 3 和 Parcel.js 2

  7. 為什麼 JavaScript 不支持多線程?

  1. 使用 Redux Toolkit 的 createAsyncThunk

  2. Node.js 和 Express 教程:構建和保護 RESTful API

  3. Switch case JavaScript 語句 |示例字符串、數字和 2 個值

  4. 瀏覽器中的事件循環和 Node Js 的區別?