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