そういうことだったんですね

いろいろ調べたり学んだりしたことを忘れないように書き連ねています

DB - MongoDB(2)

DB - MongoDB(1) - そういうことだったんですね

の続きです。

 

更新

update() を使います。第1引数に更新前のドキュメント、第2引数に新しいドキュメントを指定します。 ドキュメントは完全でなくてもかまいません。(一部を変更する)

> db.books.update({ title: "A tiny tired article" }, { $set : { sales: 10 } }) 

デフォルトでは、マッチした最初のドキュメントのみを更新します。全てを更新するには、

> db.books.update({ title: "A tiny tired article" }, { $set : { sales: 10 } }, { multi: true })

を指定します。

また、デフォルトでは、第1引数で指定したドキュメントが存在しない場合は、更新は行われません。 upsert (UPDATE+INSERT)を有効にすると存在しない場合にドキュメントを追加することができます。

> db.books.update({ id: 5 }, { $set : { title: "Hello, world!"} }, { upsert: true }) 

$set は update field operator の一つです。update field operator はよく使われる操作が定義されており、アトミックな動作が保証されています。

  • $inc  フィールドを指定した数分増やす
  • $rename  フィールド名を変更する
  • $setOnInsert  第3引数で upsert: true とし、かつ update() メソッドが insert として動作したときに値を設定する。
  • $set 存在しているフィールドの値を設定する
  • $unset フィールドを削除する
> db.books.update({ "id": 1 }, { $inc: {sales: 10} })
> db.books.update({ "id": 1}, { $rename: {sales: "uriage" } })
> db.books.update({ "id": 2}, { $setOnInsert: { title: "Hello, world" } }, { upsert: true })
   # { "id": 2 } のドキュメントが存在する場合は setOnInsert は実行されない
> db.books.update({ "id": 2 } , { $set: { price: 100 } })

find()で取得したドキュメントを変更してsaveメソッドを呼び出す方法もあります。こちらはアトミック性は保証されないので、ドキュメントの不整合に注意する必要があります。

> var book = db.books.findOne();
> book.title = "Have a nice day!";
> db.books.save(book);

 

削除

remove()を使います。doc には削除対象のドキュメントを指定します。一致するドキュメントを全て削除します。

> db.books.remove({id: 1})

 

コレクションの削除

drop() を使います。

> db.books.drop()

 

これでCRUD操作はできるようになります。今後、rubyライブラリからの操作やレプリケーション、シャーディングについて調べてみます

 

 

 

 

 

 

 

NOSQLの基礎知識 (ビッグデータを活かすデータベース技術)

NOSQLの基礎知識 (ビッグデータを活かすデータベース技術)

 
NoSQLデータベースファーストガイド

NoSQLデータベースファーストガイド