カテゴリー : MongoDB

[MongoDB] db.runCommand( { cloneCollection } ) の使い方

MongoDB で collection をコピーする db.runCommand( { cloneCollection } ) の使い方をメモ。

host: targethost1, port: 27017 と host: currenthost, port: 27018 で mongod instance が2つ立ち上がっている状態とします。

以下のようなクエリで targethost1:27017 の targetDb database にある users collection から verified_at が null ではない document を currentDb に同じ collection 名でコピーできます。

mongo --host currenthost --port 27018 currentDb
 
var query = { verified_at : { $ne : null } };
db.runCommand( { cloneCollection: 'targetDb.users', from: 'targethost1:27017', query : query } );

コピーした collection 名を変更したい場合は renameCollection でできます。

以上です。

[MongoDB] Array の length で sort するために aggregate を使う

MongoDB で Array type な field を length で sort して取得するサンプルクエリをご紹介します。

MongoDB Query

db.posts.aggregate(
[
  { $unwind: "$likes" },
  { $group: {
      _id: "$_id",
      size: { $sum: 1 }
    }
  },
  { $sort: { size: -1 } }
])

Results

{ "_id" : ObjectId("514e23e06aeaa880410321aa"), "size" : 590 }
{ "_id" : ObjectId("545c796972b4c28015ab4eac"), "size" : 395 }
{ "_id" : ObjectId("51440f7d4ca4c41367001dff"), "size" : 321 }
{ "_id" : ObjectId("51d6eef05204c9046100031d"), "size" : 315 }
{ "_id" : ObjectId("54ae81f1f158d13d60c50116"), "size" : 271 }
//...

参考情報

[MongoDB] 銀行口座のスキーマ定義

以前、Mongoose (MongoDB) で銀行口座の情報を取り扱う Scheme の定義をしたときに悩んで付けた field 名を公開します。

BANK_ACCOUNT_TYPE =
  SAVINGS: 1
  CURRENT: 2
 
BANK_ACCOUNT_TYPE_KEYS = Object.keys(BANK_ACCOUNT_TYPE)
BANK_ACCOUNT_TYPE_PATTERN = BANK_ACCOUNT_TYPE_KEYS.map (k)-> BANK_ACCOUNT_TYPE[k]
 
HogeScheme = new Scheme
bank_account:
  bank_name:
    type: String
  bank_code:
    type: String
  branch_name:
    type: String
  branch_code:
    type: String
  account_type:
    type: Number
    enum: BANK_ACCOUNT_TYPE_PATTERN
  account_number:
    type: Number
  account_holder_name:
    type: String
  account_holder_name_kana:
    type: String

というような感じにしました。

[MongoDB] field を削除するコマンド

MongoDB で不要なフィールドを削除するには、Update を $unset で利用します。

まず、検証用のデータを insert します。今回は3件新規登録します。

> db.users.insert( { name : 'test' , age : 20 } )
> db.users.insert( { name : 'hoge' , age : 50 } )
> db.users.insert( { name : 'spam' , age : 90 } )
 
> db.users.find()
{ "_id" : ObjectId("55102489395c0a2d41edd220"), "name" : "test", "age" : 20 }
{ "_id" : ObjectId("551024c0395c0a2d41edd221"), "name" : "hoge", "age" : 50 }
{ "_id" : ObjectId("551025fc395c0a2d41edd222"), "name" : "spam", "age" : 90 }

特定の _id の document の field を削除する場合、第一引数に条件を指定して、1件だけしか削除しないように第四引数に false を指定します。

> db.users.update( { _id : ObjectId( "55102489395c0a2d41edd220" ) } , { $unset : { age : 1 } } , false , false )
> db.users.find()
{ "_id" : ObjectId("55102489395c0a2d41edd220"), "name" : "test" }
{ "_id" : ObjectId("551024c0395c0a2d41edd221"), "name" : "hoge", "age" : 50 }
{ "_id" : ObjectId("551025fc395c0a2d41edd222"), "name" : "spam", "age" : 90 }

全ての document の特定の field を削除する場合、第一引数に {} を指定して全ドキュメントを対象にして、第四引数に true を指定して該当する全ドキュメントのフィールドを削除対象にします。

> db.users.update( { } , { $unset : { age : 1 } } , false , true )
> db.users.find()
{ "_id" : ObjectId("55102489395c0a2d41edd220"), "name" : "test" }
{ "_id" : ObjectId("551024c0395c0a2d41edd221"), "name" : "hoge" }
{ "_id" : ObjectId("551025fc395c0a2d41edd222"), "name" : "spam" }

最後に注意点として、update メソッドはすべてのドキュメントの field を吹っ飛ばす可能性があるので、本番データではできるだけ使わないようにしたいですね。


参考情報

$unset — MongoDB Manual 3.0.1

[MongoDB] Failed global initialization: BadValue Invalid or no user locale set. Please ensure LANG and/or LC_* environment variables are set correctly.

mongo shell に入ろうとするとエラーが発生しました。

$ mongo myDb
Failed global initialization: BadValue Invalid or no user locale set. Please ensure LANG and/or LC_* environment variables are set correctly.

取り急ぎ、デフォルトのロケールを使用するようにすれば mongo shell に接続できるようになります。

$ export LC_ALL=C

あとは、下記の記事によると不要な mongo のパッケージをアンインストールすると解決するらしいです。

[MongoDB] CentOS6.4でmongo 2.6.5 を使ったらエラーが出過ぎたので、2.6.4に変更した際のメモ – Qiita


参考情報

export LANG=C の意味は | Redhat Enterprise Linux 4

LANG=Cはメッセージを英語で出すのではない(と思う – よくきたはてダ