MongoDB快查表
简要概述
MongoDB = ドキュメント指向のDB
ドキュメント = 構造化されたデータのこと
RDBのレコードに相当する
これを単位としてデータを扱う
ドキュメントは、主キーとして _id を必ず持つ
ドキュメントはJSONのように扱える(内部的にはBSON)
データは型付けされる(BSON互換)
コレクション = データの集まり
RDBのテーブルに相当する(ただしスキーマは存在しない)
SQLのような複雑なデータ操作はできない
検索機能としては柔軟に対応できる
企業(MongoDB Inc.)が開発し、オープンソースで公開されている
有料版が存在し、セキュリティ強化などの追加機能とサポートが受けられる
その他、コンサルや教育も受け付けているとのこと
GNU APGLライセンス
クロスプラットフォーム
C++実装
スケーリング/クラスタリングに対応している
スクリプト言語としてJavaScriptを採用している
復数の言語のドライバ(バインディング)を提供
引入
请参考各个平台的官方介绍,以了解关于导入方法的详细说明。
安装
在OSX的情况下,可以通过brew来安装。
$ brew update
$ brew install mongodb --with-openssl
在Linux的情况下,您可以选择使用包管理器或从.rpm等文件进行安装。
在CentOS 6.x中,您需要注册存储库。
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
之后通过Yum。
$ sudo yum install mongodb-org
启动
使用mongod命令启动服务器。
$ mongod
$ service mongod start
对于OSX,在默认情况下,数据会放在/data/db/目录下,因此必须创建此目录并进行权限设置,否则会失败。关于安装后的启动方法,可以参考官方说明。
MongDB命令行工具
Mongo Shell = mongoコマンドで起動する対話型のコンソールのこと。
JavaScript(風のスクリプト)を使う。
# mongodに接続
$ mongo
可以通过help命令显示帮助,也可以使用Tab键进行补全。
这个SQL和Mongo的对照表十分清晰易懂。
显示状态
show <表示内容> でDBの状態を表示できる。
show dbs // DBの一覧
show collections // 使用中のDB中のコレクション一覧
show users // ユーザの一覧
show roles // ロールの一覧
选择/创建数据库。
通过使用,可以切换并利用数据库。
如果指定的数据库不存在,则会创建新的数据库。
// DB(somedb)を選択
use somedb
添加/删除集合
通过使用createCollection()函数可以新建一个集合。
此外,如果使用insert函数插入文档到不存在的数据库中,该集合也将自动创建。
// 利用中のDBにコレクションfooを追加
db.createCollection('foo')
如果要删除集合,可以使用drop()函数。
// コレクションfooを削除
db.foo.drop()
塞入
在Shell中,就像JavaScript一样,可以将任意对象赋值给变量。
// insertの結果をresultに代入
result = db.foo.insert({...})
插入
使用insert()方法。
此外还存在insertOne()和insertMany()作为简写形式。
在插入时,该文件的直接下层会自动包含 _id。
// abcコレクションにドキュメントを挿入
db.abc.insert({
'name' : 'Alpha',
'file' : {
'name' : 'test file',
'text' : '...',
}
)
寻找
可以使用find()方法。
同时还存在findOne()等缩写形式。
进行整体搜索
如果要进行全文搜索,则只需调用find()函数。
// 単にfindすると全件を取得する
db.abc.find()
设定条件
如果要指定条件,请将其作为find()的参数传递。
// トップレベルの項目nameを検索する
db.abc.find({
'name' : 'Alpha'
})
若要指定层级,请用点号分隔条件的键进行表示。
// file.nameを検索する
db.abc.find({
'file.name' : 'test file',
})
如果要在数组中搜索元素,
'<配列自身のキー>.<配列の要素の任意のキー>' : '<配列の要素の値>'
// 各ドキュメントがこんな構造だったとして:
// {
// 'list' : [
// {'name' : 'item1', ...}
// {'name' : 'item2', ...}
// {'name' : 'item3', ...}
// ]
// }
// listの中にある、名前がAlphaの要素を検索する場合は:
db.abc.find({
'list.name' : 'item1'
})
进行比较
如果在搜索条件中使用运算符的话,
如果你在搜索条件中使用运算符的话,
<键>: { <运算符> : ‘<比较值>’ }
// file.sizebytes > 1024
db.abc.find({
'file.sizebytes' : { $gt: 1024 }
})
算符可以通过常数来指定,例如$gt。(列表)
==
$ne!=
$lt<
$lte<=
$gt>
$gte>=
$in配列に含まれる$nin配列に含まれない以多种条件进行搜索
如果是AND的情况,只需要简单地列举条件即可。
db.abc.find({
'name' : 'alpha',
'file.name' : 'test file',
})
在OR的情况下,需要指定常量$or。
db.abc.find({
$or : [
{ 'name' : 'alpha' },
{ 'file.name' : 'test file' }
],
})
指定条件(计数)
如果只想获取件数,请使用count()函数。
// nameがalphaのドキュメントの件数を返す
db.abc.count({
'name' : 'alpha',
})
排序
对于使用find()进行搜索的结果,执行sort()。
排序条件是1表示升序,-1表示降序。
// serialの降順でソートする
db.abc.find().sort({
'serial' : -1
})
使用正则表达式
可以使用正则表达式作为搜索条件。
可以使用与JS相同的文字表达方式来编写。
// nameがa/Aからはじまるドキュメントを検索
db.abc.find({
'name' : /^a.*/i
})
更新
可以使用update()。此外,还有updateOne()和updateMany()作为简写形式存在。
无论如何,无法更新_id。
此外,在MongoDB中,写操作保证是以文档为单位的原子操作。
对文件进行部分更新
update(
<検索条件>,
{
$set : <更新内容>,
$currentData : <現在時刻を更新する項目>,
},
{
multi: <復数更新の有無>,
}
)
// nameがalphaのドキュメントを探し、特定の値を更新する
// 更新の際にupdated_atを現在時刻に更新する
db.abc.update({
{
'name' : 'alpha',
},
{
$set : {
// find()と同様にドット区切りで指定できる
'file.name' : 'some filename updated',
},
$currentDate : {
'updated_at' : true,
},
},
})
更新整个文件。
update(
<検索条件>,
<置換えるドキュメント>,
)
// nameがalphaのドキュメントを探し、まるごと置換える
db.abc.update({
{
'name' : 'alpha',
},
{
'name' : 'alpha updated',
// ...
},
})
删除
remove(
<検索条件>,
{
justOne : <削除対象を1件に限定する場合はtrue>,
},
)
将全部删除
传递空对象到remove()函数将删除所有条目。
如果在没有参数的情况下调用,会出错并且不会被删除。
// 全件削除する
db.abc.remove({})
指定条件删除
// nameがalphaのドキュメントを削除する
db.abc.remove({
'name' : 'alpha',
})
关于WriteResult()
Mongo会返回WriteResult()来作为带有写入操作的处理返回值。
它具有以下属性,可用于识别结果。
特殊数据的处理相关事项
日期
对于日期的处理方式有两种。
-
- 文字列で保持する方法: Date() を使う
- Unixエポックミリ秒で保持する方法: ISODate()を使う
没有调查的情况下,似乎后者更容易进行比较/计算,但变为标准时间是一个难点。
二进制
关于尺寸上限,官方有针对不同环境的数据大小上限规定,但从外观上来看,似乎是以TB为单位的数字,所以在正常使用情况下应该没有问题。
设定
使用Mongo Shell来设置DB和集合的个别配置,类似于传统的RDB。
整体配置会被记录在配置文件(如mongod.conf)中,在服务器启动时进行加载。
如果通过命令直接启动,则可以使用–config选项指定配置。
$ mongod --config /path/to/mongod.conf
设置文件以YAML格式编写。
索引
索引的概念与其他数据库相同,它们被用于提高搜索速度和设置唯一约束。
Mongo会自动为文档设置_id,并为该_id分配索引。
由于该索引具有唯一约束,因此无法插入重复的_id。
在中国指数的创建/确认/删除是通过命令来完成的。
// abcコレクションのfile.nameに対して、昇順かつユニークのインデックスを作成
db.abc.createIndex({
{ 'file.name' : 1 },
{ 'unique' : true },
})
// 設定済のインデックスを確認
db.some.getIndexes()
// インデックスを削除
db.some.dropIndex(
{ 'file.name' : 1 }
)
用户/角色/认证
在Mongo中,权限是按照用户和角色的单位进行管理的。
创建管理员用户
首先,在没有特别指定认证的情况下启动Mongo,设置管理数据库和管理员。
use admin
db.createUser({
user: "userAdmin",
pwd: "some_password",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
})
关闭服务器端(mongod),在启用认证的情况下重新启动。
认证功能可以通过–auth选项或配置文件指定。
$ mongod --auth
从现在开始,用户的创建和管理需要进行管理员用户的认证。
除非由管理员用户分配权限的用户进行认证,否则将无法访问数据库。
要进行认证,可以在客户端连接时指定,或者使用auth()函数。
// 接続時に認証する
$ mongo -u 'userAdmin' -p 'some_password' --authenticationDatabase 'admin'
// 接続後に認証する
db.auth('userAdmin', 'some_password')
创建普通用户
与管理用户一样,可以使用createUser()函数创建用户。可以指定多个目标角色和数据库。
db.createUser(
{
user: "alpha",
pwd: "some_password",
roles: [ { role: "readWrite", db: "alpha" },
{ role: "read", db: "bravo" } ]
}
)
关于卷的种类
可以从Mongo标准内置角色中选择并指定角色。
也可以自行创建角色。
待办事项
-
- コマンドの詳細
-
- 設定項目の詳細
-
- 暗号化
通信の暗号化(TLS/SSL)
ストレージの暗号化
レプリケーション
シャーディング(クラスタリング)
API/ドライバ
请参照以下内容:
-
- Wikipedia – MongoDB
MongoDB(公式)
Getting Started with MongoDB (MongoDB Shell Edition)¶
The MongoDB 3.4 Manual
mongo Shell Quick Reference
Data Types in the mongo Shell
MongoDB CRUD Operations
Reference
Indexes
Security