mongodbの使い方。忘れたときに見るメモ

mongodbの使い方。忘れたときに見るメモ。

mongodbの使い方

基本: mongodbは大文字と小文字を区別すします。

バージョン確認

$ mongo --version
MongoDB shell version: 2.6.12

mongoshellの起動

$ mongo
exit #exitでshellを抜ける

mongodbの起動と停止、状態の確認

$ sudo service mongod start  #起動
$ sudo service mongod stop   #停止
$ sudo service mongod status #状態の確認 プロセス番号が表示されます

データベース・コレクション・ドキュメント

mongodbはデータベースのなかにコレクションというものを作成します。このコレクションというものはSQLとかでいうテーブルみたいなものだと思います。mongodbはjavascriptを文法を使って書いていくのが特徴でうs

データベース

一覧: show dbs;
新規作成 or 切替: use hoge;
現在のデータベース: db.stats();

削除: db.dropDatabase(); 切替後に行う
ヘルプ: help
終了: exit

コレクション

とりあえずなにかをデータを作成するにはコレクションを作成しないといけません。

collectionが作らてはじめてデータベースが作成される
コレクションの作成: db.createCollection(‘test’)
コレクションの状態確認: show collections
コレクションの名前の変更: db.hoge.renameCollection(‘fuga’)
コレクションの削除: db.hoge.drop(); true

ドキュメント

mongodbはコレクション(テーブルみたいなもの)にドキュメントというものを書いていきます
# 新規作成: db.col.insert();
db.users.insert({name: “taguti”, score: 30});
db.users.insert({name: “fkoji”, tags[“web”, “mobile”] });

# 全抽出: db.col.find();
db.users.find(); //idが一意につけられている
db.users.count();//ドキュメントの個数

# 全削除: db.col.remove(); //ドキュメントがすべて消える
db.users.remove(); // ver.2系
db.users.remove({}); // ver.3系 書き方違うとエラーが発生するremove needs a query at

# 条件抽出
db.users.find({key: value});
db.users.find({name: “user-1”}); //user-1を指定
db.users.find({name: /user-[1-3]/});//正規表現
db.users.find({score: {$gt: 30}}); //30より大きい
// $gt $gte | 大きい 以上
// $lt $lte | 小さい 以下
// $ne $eq | ではない である
db.users.find({name: {$ne: “user-1”}});

$and, $or, distinct

<>
//andはカンマ区切り
db.users.find({
team: “team-0”,
score: {$lt: 50}
});
//$and演算子を使う書き方 ややこしい 配列を使っている
db.users.find({
$and: [
{team: “team-0”},
{score: {$lt: 50}}
] })

<>
//OR 複数の条件
//$in 指定のオブジェクトがあるか
//$exists オブジェクトが存在するか
db.users.find({
$or: [
{team: {$in: [‘team-0’, ‘team-1’]}},
{score: {$exists: 50}}
] })

<>
do.user.distinct(‘team’); //どんな要素が含まれているか
db.users.distinct(‘team’);

find, findOne, sort

mongodbでは主にfindでデータを抽出していくようです。
<>
db.users.find({}, {name:1}) //nameだけを表示させる
db.users.find({}, {name:0}) //nameだけを表示させない
db.users.find({}, {name:1, score:1}) //nameとscoreを表示させたい
//db.users.find({}, {name:1, score:0})//ミックスさせてはいけない
db.users.find({}, {name:1, score:1, _id:0})//idのみミックス可能

findOneやlimitを使用することによって、抽出件数を制限することが可能になっています。
<>
db.users.findOne({}, {name:1, score:1, _id:0}) //最初の一件だけ表示
db.users.find({}, {name:1, score:1, _id:0}).limit(3) //3件だけを抽出
db.users.find({}, {name:1, score:1, _id:0}).skip(3).limit(3) //最初の3件だけスキップして表示する件数は3件に絞り込む

sortは-1や1をつかうとソート順を変更することができますfindをチェーンしているのもポイントでしょうか。
<>
db.users.find({}, {_id:0}).sort({score:-1}) //大きい順
db.users.find({}, {_id:0}).sort({score:1}) //小さい順

update, $set, $unset, $inc

データの更新でupdateするときに$setを使わないと、アップデートするドキュメントの内容がすべて変わってしまいます。

# $set
//db.users.update({name: “user-0”}, {score:100});//すべてがおきかわってしまう
db.users.update({name: “user-0”}, {$set: {score:100}}); //$setを使う

# $unset
db.users.update({name: “user-1″}, {$unset: {score:””}}); //scoreを消す scoredocument自体が消える

# $inc インクリメント
db.users.update({name: “user-2”}, {$inc: {score:10}});

# $rename ドキュメント名を変更する
db.users.update({name: “user-2”}, {$rename:{score: “myscore”}}); //user-2のscoreドキュメントをmyscoreに変更

索引(index)

// 一覧 db.col.getIndexes(); //デフォルトでidにindexがついている
db.users.ensureIndex({score: 1}) //1は降順 -1は昇順
db.users.dropIndex({score: 1}) //削除
db.users.ensureIndex({name: 1}, {unique:true}); //ユニー重複をふせぐ
db.users.insert({name: “user-0”});ユニークがきいているのでエラー duplicate

// 追加 db.col.ensureIndex();
// 削除 db.col.droopIndex();

複数のドキュメント更新

複数のデータを更新するにはmulti:trueを第三引数にもたせなければなりません。upsertは

<>
//db.users.update({name: “user-0”}, {score: 100})//これは間違い

<>
updateする対象が複数だった場合
db.users.update({team: “team-0”}, {$inc: {score: 10}}); //1件しか更新されない
db.users.update({team: “team-0”}, {$inc: {score: 10}}, {multi: true}); //multiを使う

<>
upsertはupdateするドキュメントがなかったらinsert。ドキュメントがあったらupdateするというものです。第三引数にupsert:trueがあることがポイントです。

db.users.update({name: “taguti”}, {name: “taguti”, team: “dotinstall”, score: 200}, {upsert: true}); //tagutiが見つからなかったらinsertする見つかったらupdateする

<<条件付きremove>>
db.users.remove({name: “taguti”})

<>
データベースのバックアップと復元
mongodump バックアップ
mongorestore 復元

mongodump -d mydb ローカルのシェルで行う dumpというディレクトリが作成される
mongorestore 復元する ローカルのシェルで行う
mongorestore –drop 既に存在するデータベースの上書き?

mongodbのトラブル

MongoNetworkError: failed to connect to server

node.jsでmongodeのnpmを使用したらこのエラーがでました。

よくわからないけど、ipがあってるけどポート番号があってるのからわからない。そもそもmongodbがよくわらないけど、とりあえず /etc/mongod.conf
を編集すればいいみいたなので、暫定対象で編集します。root権限がないと書き込みができいないのでrootで開きます。

$ sudo vi  /etc/mongod.conf

編集内容はbind_ipとかいてある行をコメントアウトします。/etc/mongod.confファイルの19行目にありました。この作業が終わったらmongodbを再起動します。

18 # Listen to local interface only. Comment out to listen on all interfaces.
19 #bind_ip=127.0.0.1

constキーワードがとおらない

mongodbとは関係ないかもしれませんが、node.jsでconstキーワードが通らないエラーが発生しました。ネットの情報でnode.jsのバージョンが古いとのことだったので、node.jsのバージョンアップを行いました。結果エラーは解決しました。node.jsのバージョンアップのやり方は↓に書いています。
npmやnode.jsのバージョン管理モジュール「n」を使ったらハマった話

TypeError: db.collection is not a function

ドットインスト―ルでnode.jsの勉強をしていると、TypeError: db.collection is not a functionというエラーがおきる。ネットをしらべてみると、mongodbのバージョンが新しいものだとちょっと書き方が違うみたいです。以下のサイトが参考になりました。
MongoDB – node mongo.jsでthrow err;が出る|teratail

collection.find().stream 何も表示されない

こちらもnode.jsの話で少し脱線していますが、非同期処理の問題で何も表示されないみたいです。解決方法は以下に書いてあります。
MongoDB – streamを使ってドキュメントが抽出できない|teratail


Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 49

Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 78