2016-07-19 9 views
0

少し奇妙な状況があります。Mongodbが長すぎるオブジェクトを見つけられません。

私は明示的に_idを設定するコレクション "refs"にオブジェクトを残します。 私は非常に大きなIDのオブジェクトを持っています。

db.refs.find().sort({_id: -1}); 
// {_id: 9200000000165761625} 
// ... 

しかし、私はそれが何も返さないシェルモンゴで最大のidを持つオブジェクトを検索してみてください。

db.refs.find({_id: 9200000000165761625}); // nothing 

しかし!

db.refs.find({_id: 9200000000165761625}).count(); // return 1 

これはどうして起こりますか?

+0

db.refs.count({_ id:9200000000165761625})はどうですか? –

+0

私の_idとしてツイッターIDを使用しようとして同じ問題があります。 Pythonローダーコードをstr(tweet.id)を使うように変更しました。 –

答えて

0

問題を再現できませんでした。あなたが指定した_id値で正常に問い合わせることができました。 enter image description here

あなたが照会するときに、正しいコレクション名を渡していることを確認してください

+0

FYIあなたのスクリーンショットではまだ問題は明らかです。JavaScriptの最大安全な整数よりも長い値は 'mongo'シェルで安全に表現できません。挿入した '_id'は検索している値(数学的に)と一致しませんが、どちらもJavaScript番号と同じ表現になります。 – Stennie

0

JavaScriptが現在唯一の64ビット浮動小数点値としてすべての値を表す単一の数値型Numberを持っています。 JavaScriptのネイティブのNumber型の最大安全整数表現は、2 -1または9007199254740991(定数Number.MAX_SAFE_INTEGERによって返される)です。

安全範囲外の整数値は明示できません。そのため、2つ以上の数学的値が同じJavaScript番号にマッピングされます。

あなたは(安全な整数のサイズよりも大きい)ご提供_idに隣接する値とmongoシェルでこの効果を見ることができます:

> 9200000000165761624 
9200000000165762000 

> 9200000000165761625 
9200000000165762000 

> 9200000000165761626 
9200000000165762000 

はしかし、これらのドライバ/クライアントの制限は、基礎となるとは区別されますドキュメントのためにMongoDBのBSON formatで使用されるデータ型。 BSONには64ビット整数型があり、値の全範囲を表します。最大値は2で -1 64ビット整数です。

_idは64ビット整数の範囲内にありますので、64ビット整数をサポートするドライバを使用してこれを挿入または更新できますが、64ビット整数を安全に照会または操作することはできません。 mongoシェルまたは他のJavaScript環境予期しない結果を避けるために、これらの長い値の異なるデータ型を使用することができます。_id

関連する問題