カテゴリー : MongoDB

[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はメッセージを英語で出すのではない(と思う – よくきたはてダ

[MongoDB] mongo shell から別DBへ接続してクエリを実行する

MongoDB で別データベースに接続してクエリを実行する方法をメモ。

前提

2つの DB サーバで保存する collection を分けて管理しているとします。

データベース1

  • Host: mongodb1
  • Port: 27017
  • DB: myDb

データベース2

  • Host: mongodb2
  • Port: 27017
  • DB: myDb

別 DB への connection を作成する方法

mongo shell で query を実行するときに別 DB の collection も扱いたい場合、その DB への connection を作成してあげればいいです。

$ mongo mongodb1/myDb
mongodb1> db2 = connect("mongodb2:27017/myDb")
connecting to: mongodb2:27017/myDb
myDb
 
// mongodb2 サーバにの mdDb に保存されている somecollections のデータを扱うことができる
mongodb1> db2.somecollections.findOne()

DB サーバが1台のときは気にしなくてよかったのですが、複数台になると別 DB サーバへのコネクションを扱う Tips も知っておけば今までどおり mongo shell からクエリを実行しまくれますね。


参考情報

connect() — MongoDB Manual 2.6.7

別DBへのコネクションを扱う : MongoDB – Mongo shellの裏技色々 – Qiita