ActiveRecordでjsonの値を取り出す
mongoDB query embedded documentsとかを検索ワードにして調べてみました。
https://stackoverflow.com/questions/3954520/mongoid-mongodb-and-querying-embedded-documents
https://stackoverflow.com/questions/24749312/mongoid-querying-embedded-docs/24749539
階層化されているjsonデータは.でつなげば取得できそう。
今回やりたかったのはwhereでcptrans内の特定keyの値がnullでない場合のレコードだけを抽出
##Networkモデル
{
_id: 1,
cptrans: {
_id: ObjectId('61712564a3519d0001fe97aa'),
mcc: 440,
mnc: 51,
tracking_area_code: 41481,
cell_id: '68030469',
location_area_code: 0,
rsrp: -66,
rssi: -41,
rsrq: -7,
rssnr: 0,
traffic_channel: 0,
band: 18,
radio_interface: 'LTE',
band_width: '0',
}
}
Networksモデルに上記のようなjsonデータがmongoDBに格納されている
ここからwhereでcptrans内の特定keyの値がnullでない場合のレコードだけを抽出したい場合
下記のようになる.
結果
rank_typeに抽出したいkeyをいれてあげる
Nerwork.where("cptrans.#{rank_type}" => { '$ne' => nil })
私はkey毎に抽出を変えたかったのでsocpeを作成し、下記のような感じで対処しました。
scopeって何それって人はこれ参考にするといいかも
https://qiita.com/ngron/items/14a39ce62c9d30bf3ac3
scope :rank_type, ->(rank_type) {
case rank_type
when :rsrp, :rsrq, :rssnr then where('cptrans' => { '$ne' => nil })
when :rssi, :nr_rssi, :nr_rsrp, :nr_rsrq then where("cptrans.#{rank_type}" => { '$ne' => nil })
when :tx_rate then where('iperf' => { '$ne' => nil })
end
}
# 参考
scope
https://qiita.com/ngron/items/14a39ce62c9d30bf3ac3
mongoDBのハッシュ値の取得
https://stackoverflow.com/questions/3954520/mongoid-mongodb-and-querying-embedded-documents
https://stackoverflow.com/questions/24749312/mongoid-querying-embedded-docs/24749539