[MongoiDB][Java] MongoCollection::updateOne で更新ができずハマった・・・
MongoDBを使用した開発をしていて、データを更新するコーディングしてたら、
com.mongodb.client.MongoCollection::updateOne で update処理動かしてもデータが更新されない・・・
第一引数に更新条件のFiIterを設定して、第二引数に更新データをセット。
なんども、更新用データを確認したが反映されない。。。
試しにfindすると、条件で抽出できているのでFilterには問題なさそう。
エラーも出てない。。。
結局は、更新用データに org.bson.Document を使用していたからみらい。
なので、”replaceOne(Bson filter, TDocument replacement)” のほうを使用して無事更新することができました。。
updateOne(Bson filter, Bson update)は更新データの型はBsonでした。
Documentでも大丈夫かと思いましたが、ダメだったみたいです・・・
[参考]
APIリファレンス
http://api.mongodb.com/java/current/com/mongodb/client/MongoCollection.html
com.mongodb.client.MongoCollection::updateOne で update処理動かしてもデータが更新されない・・・
第一引数に更新条件のFiIterを設定して、第二引数に更新データをセット。
なんども、更新用データを確認したが反映されない。。。
試しにfindすると、条件で抽出できているのでFilterには問題なさそう。
エラーも出てない。。。
結局は、更新用データに org.bson.Document を使用していたからみらい。
なので、”replaceOne(Bson filter, TDocument replacement)” のほうを使用して無事更新することができました。。
updateOne(Bson filter, Bson update)は更新データの型はBsonでした。
Documentでも大丈夫かと思いましたが、ダメだったみたいです・・・
[参考]
APIリファレンス
http://api.mongodb.com/java/current/com/mongodb/client/MongoCollection.html
[Oracle] NULLの計算
「NULLの比較について」以前に記載したが、
今回は、計算でNULLが入った場合どうなるか検証。
今回使用したテーブル(TEST_TBL)のデータは以下。

SUMした場合どうなるか??
select TEST, SUM(NUM), SUM(NUM2)
from TEST_TBL
group by A_CODE;
実行結果は、どうやらNULLは無視されているようです。
SUM(NUM2)はNULLを除いた「200+220=400」が出力されています。

ちなみに、以下のSQLのように計算した場合、
NULLの計算はNULLになるようです。
select 100 + null, 100 + 200
from dual;
実行結果は、「100 + null」はNULLになり、「100 + 200」は300になりました。
数値のカラムに"NOT NULL"制約がついてなかったりして、
NULLになる可能性がある場合、計算は要注意ですな。
今回は、計算でNULLが入った場合どうなるか検証。
今回使用したテーブル(TEST_TBL)のデータは以下。

SUMした場合どうなるか??
select TEST, SUM(NUM), SUM(NUM2)
from TEST_TBL
group by A_CODE;
実行結果は、どうやらNULLは無視されているようです。
SUM(NUM2)はNULLを除いた「200+220=400」が出力されています。

ちなみに、以下のSQLのように計算した場合、
NULLの計算はNULLになるようです。
select 100 + null, 100 + 200
from dual;
実行結果は、「100 + null」はNULLになり、「100 + 200」は300になりました。
数値のカラムに"NOT NULL"制約がついてなかったりして、
NULLになる可能性がある場合、計算は要注意ですな。
[Oracle] 主要なデータ型
カラムによく指定される型を紹介。
CHAR(n)
文字列型(固定)です。
カッコでサイズを指定します。固定長なので、サイズを満たない
文字列を挿入した場合は、空白が入ります。
VARCHAR2(n)
文字列型(可変)です。
カッコで最大サイズを指定します。可変なので、サイズを満たない
文字列を指定しても空白は入りません。
NUMBER(n1,n2)
数値型です。カッコで制度(全体桁数と少数桁数)を指定します。
n1:小数を含めた全体の桁数
n2:小数の桁数
DATE
日付型、その名の通り日時を格納するカラムです。
データの登録日や更新日などによく使用します。
※ CHARとVARCHAR2を比較するとき、CHARには空白が入ることを
考慮しないと、予期せぬ比較結果となることがあるので注意。
CHAR側の文字列をRTRIMを使用して右側の空白を削除して
比較するなど検討したほうがいい。
CHAR(n)
文字列型(固定)です。
カッコでサイズを指定します。固定長なので、サイズを満たない
文字列を挿入した場合は、空白が入ります。
VARCHAR2(n)
文字列型(可変)です。
カッコで最大サイズを指定します。可変なので、サイズを満たない
文字列を指定しても空白は入りません。
NUMBER(n1,n2)
数値型です。カッコで制度(全体桁数と少数桁数)を指定します。
n1:小数を含めた全体の桁数
n2:小数の桁数
DATE
日付型、その名の通り日時を格納するカラムです。
データの登録日や更新日などによく使用します。
※ CHARとVARCHAR2を比較するとき、CHARには空白が入ることを
考慮しないと、予期せぬ比較結果となることがあるので注意。
CHAR側の文字列をRTRIMを使用して右側の空白を削除して
比較するなど検討したほうがいい。
[SQL] NULLの比較について
以下のようなテーブル(TEST_TBL)があるとします。

で、このテーブルの 'A_CODE' が空(NULL)のデータを
抽出したいとします。
SELECT * FROM TEST_TBL
WHERE A_CODE = NULL
このように "= NULL" で比較するのはNG。
結果は1件も抽出されません。
NULLはイコールで比較できないんですね。
ということで、以下のように "IS NULL" を使います。
SELECT * FROM TEST_TBL
WHERE A_CODE IS NULL

ちゃんとNULLのレコードが抽出できました。
ちなみに、以下の方法で "=" を使用してNULLのものを
抽出できそうですが、問題がちらほらとあります。
SELECT * FROM TEST_TBL
WHERE NVL(A_CODE, 'NULL') = 'NULL'
問題点は、もし "A_CODE" に 'NULL' という文字列の
データが入っていたら、抽出されてしまう。
あとは、WHERE句でNVL関数を使用してしまっているため、
インデックスは有効にならず、全表走査してしまうので
パフォーマンスが悪くなる。
ということで、やっぱり "IS NULL" での判定がいいのですな。

で、このテーブルの 'A_CODE' が空(NULL)のデータを
抽出したいとします。
SELECT * FROM TEST_TBL
WHERE A_CODE = NULL
このように "= NULL" で比較するのはNG。
結果は1件も抽出されません。
NULLはイコールで比較できないんですね。
ということで、以下のように "IS NULL" を使います。
SELECT * FROM TEST_TBL
WHERE A_CODE IS NULL

ちゃんとNULLのレコードが抽出できました。
ちなみに、以下の方法で "=" を使用してNULLのものを
抽出できそうですが、問題がちらほらとあります。
SELECT * FROM TEST_TBL
WHERE NVL(A_CODE, 'NULL') = 'NULL'
問題点は、もし "A_CODE" に 'NULL' という文字列の
データが入っていたら、抽出されてしまう。
あとは、WHERE句でNVL関数を使用してしまっているため、
インデックスは有効にならず、全表走査してしまうので
パフォーマンスが悪くなる。
ということで、やっぱり "IS NULL" での判定がいいのですな。