0

MongoDB 2.2 とバージョン 1.3 の Mongo 用 PECL パッケージにアップグレードしてから (どの変更が関連するかはわかりません)、int にキャストされたフィールドの PHP による挿入が、コレクションに NumberLong として挿入されるようになったことに気付きました ( {"userid" : NumberLong (792)})。以前は、整数 ( {"userid" : 792} ) として挿入されていました。また、新しいレコードは現在 NumberLong を使用していますが、コレクションは混合されており、類似のフィールドが異なる型を持っています。

特にインデックス作成と検索で問題が発生する可能性はありますか? 1 つの形式が優先されますか (NumberLong が優先されると思います)。コレクションを新しい形式に更新する簡単な方法はありますか?

4

2 に答える 2

1

クエリの目的では、さまざまなタイプの数値フィールドで問題が発生することはありません。整数、倍長、および倍精度はすべて、比較される前に変換されます。同様に、数値フィールドに一意のインデックスがある場合、と の値をx持つ 2 つのドキュメントを挿入しようとするとエラーが発生します。これについては、Compare Order for BSON Typesドキュメントに記載されています。11.0x

于 2013-01-29T19:01:42.837 に答える
-1

昨夜すぐに書いたので、この回答を書き直しました。それ以来、実際には見ていません。

これは、 の ini 設定native_longが on に設定されているためです。

この場合に使用される MongoDB データ型は、この設定がオフになっている場合に使用される BSON INT ではなく、BSON LONG です。

http://php.net/manual/en/mongo.configuration.php#ini.mongo.native-long

この背後にある理論的根拠は、64 ビット システムが 64 ビット INT を格納できるようにすることです。

Docページでアドバイスされているように:

このデフォルトの動作は 2.0.0 で TRUE に変更されるため、この変数を必要な値 (おそらく TRUE) に設定して、アップグレード時にドライバの動作が突然変化しないようにしてください。

そのため、すべてのドキュメントをアップグレードして、ドライバーのこの将来の機能と互換性があることを確認することをお勧めします。

だから答える:

コレクションを新しい形式に更新する簡単な方法はありますか?

いいえ、実際にはありません。すべてのドキュメントを確認し、適切なデータ タイプで再保存する必要があります。

あなたの懸念のいくつかについて:

特にインデックス作成と検索で問題が発生する可能性はありますか? 1 つの形式が優先されますか (NumberLong が優先されると思います)。

これは別のオブジェクトであるため、これらの数値による検索で問題が発生します。

ただし、このビットを処理するように PHP アプリケーションをセットアップすると、ドライバーは自動的に INT をデータベース内のそれぞれの表現に変換します。intしたがって、セットアップが完了すると、PHP 側では通常のオブジェクト タイプが表示されるだけなので、実際には余分な作業は発生しません。

インデックス作成に関しては、それほど影響しないはずです。値のみがインデックスに格納され、値はここで 2 つの間で同じです。

現時点でこの機能を使用して問題が発生した場合は、実際にこれをオンにする行をコメントアウトすることで、PHP.ini からいつでもオフにすることができます。

于 2013-01-24T16:35:38.273 に答える