MongoDBのNumberLong(x)とNumberLong("x")の違いとは?
MongoDBにおけるNumberLong(x)とNumberLong("x")の違いとは?
MongoDBで64ビット整数を扱う際に使われるNumberLongですが、引数の渡し方によって挙動が大きく異なります。数値をそのまま渡すNumberLong(x)の場合、値が精度の限界を超えると丸め処理が行われてしまうのに対し、文字列として渡すNumberLong("x")では丸められることなく正確な値が保持されます。
この現象の原因は、シェル上の数値リテラルが倍精度浮動小数点数(double)として解釈されることにあります。988998985857575789のような非常に大きな整数は、double型では正確に表現できないため、最も近い表現可能な値へと丸められてしまうのです。
実際の挙動を確認してみよう
それでは、同じ数値を使ってNumberLong(x)とNumberLong("x")の両方を実行し、その違いを確認してみましょう。
まず、ドキュメントを含むコレクションを作成します。
> db.demo603.insert({"longValue" : NumberLong(988998985857575789)});
WriteResult({ "nInserted" : 1 })
> db.demo603.insert({"longValueInString" : NumberLong("988998985857575789")});続いて、find()メソッドを使ってコレクション内のすべてのドキュメントを表示します。
> db.demo603.find().pretty();
実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e9605e5ed011c280a0905d1"),
"longValue" : NumberLong("988998985857575808")
}
{
"_id" : ObjectId("5e9605faed011c280a0905d2"),
"longValueInString" : NumberLong("988998985857575789")
}結果からわかること
出力結果を見ると、NumberLong(988998985857575789)として保存した値は「988998985857575808」に丸められているのに対し、NumberLong("988998985857575789")と文字列で指定した値は、元の「988998985857575789」のまま正確に保存されていることが確認できます。
このように、IDやカウンターなど精度が重要になる大きな整数値を扱う場合は、必ず文字列形式でNumberLong("x")と指定するのが安全です。意図しないデータの破損やバグを防ぐためにも、この違いをしっかり理解しておきましょう。
-
C#と.NETの違いをわかりやすく解説!言語とフレームワークの関係
C#と.NETの基本的な違いC#(シーシャープ)はマイクロソフトが開発したプログラミング言語であり、一方の.NET(ドットネット)はアプリケーション開発を支援するフレームワークです。この2つは密接な関係にありますが、それぞれの役割はまったく異なります。.NETの中核となる「共通言語ランタイム(CLR)」.NETには「共通言語ランタイム(CLR:Common Language Runtime)」と呼ばれる仮想的な実行環境が組み込まれています。CLRはメモリ管理、例外処理、セキュリティなどを担当し、.NET上で動作するすべてのアプリケーションの土台となる重要なコンポーネントです。C#だけじゃない!
-
GoとJavaの違いを徹底比較!特徴と使い分けのポイント
プログラミング言語を選ぶ際、「Go」と「Java」のどちらを採用すべきか迷う開発者は少なくありません。どちらもGoogleや企業システムで広く使われる人気言語ですが、設計思想や言語仕様には大きな違いがあります。本記事では、それぞれの言語の特徴を解説したうえで、両者の主な違いを比較表を使ってわかりやすく整理します。 GoとはGoはGoogleが開発した手続き型(プロシージャル)プログラミング言語です。プログラムはパッケージ単位で構成され、シンプルで読みやすいコード記述を重視した設計になっています。動的言語に近い柔軟なパターンを取り入れつつ、静的型付けによる安全性も兼ね備えています。また、軽量スレ