MongoDB的入门安装和使用方法,包括命令行和程序

首先

我只是知道NoSQL这个词,但不知道具体是什么。由于有机会使用,我将记录一下使用MongoDB的经历。
学习NoSQL很容易理解,MongoDB是最快的方式。
NoSQL是一种不使用SQL的数据库管理系统,与传统的定义表和插入数据的方式不同,它可以灵活地存储数据。
(以后可能会出现类似动态类型语言与静态类型语言的争论)

安装

由於我使用的是Ubuntu 18.04,所以我按照以下步驟而非參考文章進行了MongoDB的安裝。

安装apt,以便直接使用文章中的信息。

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
sudo apt update
sudo apt install mongodb-org

确认和激活服务

sudo systemctl status mongod
sudo systemctl enable mongod
sudo systemctl start mongod

用命令行操作

访问

首先访问MongoDB服务器并指定数据库。有关警告的解释也在Ubuntu MongoDB安装步骤中提到了。

root@htsuji-VirtualBox:/usr/src/go-go1.12.5/src# mongo
MongoDB shell version v3.4.20
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.20
Server has startup warnings:
2019-06-01T19:45:44.038+0900 I STORAGE  [initandlisten]
2019-06-01T19:45:44.038+0900 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2019-06-01T19:45:44.038+0900 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2019-06-01T19:45:44.140+0900 I CONTROL  [initandlisten]
2019-06-01T19:45:44.140+0900 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2019-06-01T19:45:44.140+0900 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2019-06-01T19:45:44.140+0900 I CONTROL  [initandlisten]
> use testdb
switched to db testdb

原本的基础

在SQL中,数据是通过数据库->表->记录的层次结构存储的,而在MongoDB中,数据是通过数据库->集合->文档的结构来管理的。
文档可以像JSON一样以键值对的形式进行注册,因此可以将自由格式的数据作为文档进行处理。

在触摸的感觉上,集合就像是类的实例,用于处理类方法来进行数据库操作。
如果按照参考URL创建了名为testcoll的集合,则可以使用db.testcoll的方法来进行插入等操作。
在不加()的情况下执行,会显示方法的内部内容,很有趣。内部内容为JavaScript语言。

> db.testcoll.find
function (query, fields, limit, skip, batchSize, options) {
    var cursor = new DBQuery(this._mongo,
                             this._db,
                             this,
                             this._fullName,
                             this._massageObject(query),
                             fields,
                             limit,
                             skip,
                             batchSize,
                             options || this.getQueryOptions());

    var connObj = this.getMongo();
    var readPrefMode = connObj.getReadPrefMode();
    if (readPrefMode != null) {
        cursor.readPref(readPrefMode, connObj.getReadPrefTagSet());
    }

    var rc = connObj.getReadConcern();
    if (rc) {
        cursor.readConcern(rc);
    }

    return cursor;
}

插入

使用”insert”。

> db.testcoll.insert({"name":"me3", "value":"data3"})
WriteResult({ "nInserted" : 1 })

根据

使用find或findOne函数,相当于选择所有的数据。

> db.testcoll.find()
{ "_id" : ObjectId("5cf257eacce5a81569e74804"), "name" : "me", "value" : "data" }
{ "_id" : ObjectId("5cf2599201876469e16bfcba"), "name" : "me2", "value" : "data2" }

选择 * 表名 在 XXX 适用 的条件下

> db.testcoll.find({name:"me"})
{ "_id" : ObjectId("5cf257eacce5a81569e74804"), "name" : "me", "value" : "data" }

> db.testcoll.findOne({name:"me"})
{
        "_id" : ObjectId("5cf257eacce5a81569e74804"),
        "name" : "me",
        "value" : "data"
}

其他指令 (Tā de

以下是公式文件。
此外,这些文章可能会对您有所帮助。
有关MongoDB的基础知识。

使用程序来操作

我已经尝试过Bash、JavaScript和Golang。其他的语言我将提供参考链接。
每种语言的信息都可以在官方网站上找到。
MongoDB的驱动程序和对象文档映射(ODM)

狠狠地责备

虽然程序有点微妙,但我们需要立即使用它,所以下面记录一下。
用mongo –host 主机名 数据库名 –eval ‘命令’就可以了。

$ mongo --host localhost testdb --eval 'db.testcoll.findOne({name:"me"})' --quiet
{
        "_id" : ObjectId("5cf257eacce5a81569e74804"),
        "name" : "me",
        "value" : "data"
}

在控制台之外执行MongoDB Shell的参考方法是什么?

顺便说一句,`mongo`命令还有一个选项,可以指定一个JS文件。

const testcoll = db.testcoll
print(JSON.stringify(testcoll.findOne({name:"me"}), null, " "))
# mongo --host localhost:27017 testdb --quiet cmp.js
{
 "_id": {
  "$oid": "5cf257eacce5a81569e74804"
 },
 "name": "me",
 "value": "data"
}

参考:如何在MongoDB中轻松执行批处理(执行JavaScript文件)方法

JavaScript(Node.js)

因为基于 JavaScript,所以用 Node.js 处理起来应该很轻松。但是返回的数据是作为对象返回的,所以感触可能会有所不同。可以通过 npm install mongodb –save 进行安装,然后可以按以下方法使用。

const MongoClient = require("mongodb").MongoClient;
const _url = "mongodb://127.0.0.1:27017";

//connectで接続。mongoでログインした状態に近い
MongoClient.connect(_url, { useNewUrlParser: true }, (error, client) => {
    //use testdb相当
    const db = client.db('testdb');
    //collection指定
    var collection = db.collection("testcoll");
    collection.find().toArray((error, docs) => {
        console.log(docs)
    })
    client.close();
});

公式:MongoDB Node.JS 驱动程序
参考:Node.js 的 MongoClient 规范已经发生了变化

Go语言

MongoDB的公式是mongo-go-driver。

真是太棒了,go get不能使用!在dep中进行包管理,并使用ensure来添加。
在使用dep进行包管理之后,通过dep ensure -add “go.mongodb.org/mongo-driver/mongo@~1.0.0″来添加包。
可以像这样处理。

package main
import (
        "go.mongodb.org/mongo-driver/mongo"
        "go.mongodb.org/mongo-driver/mongo/options"
        "go.mongodb.org/mongo-driver/bson"
        "context"
        "time"
        "fmt"
)

type Document struct {
        Name string
}

func main() {
        //client情報作成
        client, _ := mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:27017"))
        //contextを作ってバックグラウンド実行。(nilだとmongo側でContextを作成してます。)
        ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
        defer cancel()
        //DB接続
        client.Connect(ctx)
        defer client.Disconnect(ctx)
        //use database
        db := client.Database("testdb")
        //collection指定
        coll := db.Collection("testcoll")
        //find
        current, _ := coll.Find(
                context.Background(),
                bson.D{},
        )
        defer current.Close(context.Background())
        //findの戻り値はポインタのような感覚で使う模様。Nextでなめていく
        for current.Next(context.Background()) {
                //Decodeで中身を取り出す。
                var doc Document
                current.Decode(&doc)
                fmt.Printf("%+v\n", doc)
        }
}

Context用于在后台处理请求并且不会被数据库访问阻塞的goroutine中使用。即使没有指定go routine,我也稍微查看了一下,结果发现里面还是创建了Context。

参考:
公式文档:examples_test.go(关于数据库连接部分)
公式文档:examples.go(关于数据库连接之后)
官方文档:GoDoc
关于使用golang上下文以及相关概念(什么是上下文)的讨论说明。

GlobalSign/mgo 全球信息网/mgo

在使用Golang的Mongo时,我们首先遇到的并不是官方文档,而是这个资源。您可以直接使用go get来使用它。

go get -v github.com/globalsign/mgo

后续的操作与JavaScript类似,首先连接,指定数据库->指定集合->执行命令的形式。在这里不使用上下文,所以简单。
在Find中只是创建了一个用于获取信息的结构体,然后才执行One或All等命令来实际获取信息。

package main

import (
    "fmt"
    "github.com/globalsign/mgo"
    "github.com/globalsign/mgo/bson"
)

type Document struct {
        Id bson.ObjectId `bson:"_id"`
        Name string
}

func main() {
    //connect to mongo
    connection, _ := mgo.Dial("mongodb://localhost/testdb")
    defer connection.Close()
    //use testdb
    db := connection.DB("testdb")
    //get collection
    collection := db.C("testcoll")
    //Find
    documents := collection.Find(bson.M{})
    var doc Document
    documents.One(&doc)

    fmt.Printf("documents::%+v\n", doc)
}

Mgo公式:
GoDoc
参考:
border/mgoExample.go
使用Go语言连接MongoDB的第一步是安装。

MongoDB是一个开源的非关系型数据库管理系统,可以有效地处理大量的结构化和非结构化数据。更多有关MongoDB的信息和文档可以在https://docs.mongodb.com/ecosystem/drivers/上找到。

其他

虽然我没有实际尝试过,但我会写下在Google上看到的东西。没有特定的标准。
由于上述已介绍了丰富的MongoDB驱动程序和ODM,如果你有兴趣的话,可以参考那个。

    PHP

MongoDB的驱动器的公式

    Ruby

公式:MongoDB的Ruby驱动程序
参考:连接Ruby与MongoDB的MongoDB Ruby驱动程序

    Python

公式:
PyMongo 3.8.0 文件
Python MongoDB 驅動程式
參考:
使用Python操作NoSQL資料庫「MongoDB」的基本方法總結〜pymongo

bannerAds