23

このような 2 つの MongoDB ドキュメントがある場合...

db.test.insert( {"value" : "10123"} );
db.test.insert( {"value" : "160"} );

次のようなクエリの結果:

db.test.find({"value" :{$gt : "12"} });

は..

{ "_id" : ObjectId("4c6d1b92304326161b678b89"), "value" : "160" }

最初の値が返されないように、文字列の比較が行われることは明らかです。クエリ内でキャストする方法はありますか?

何かのようなもの:

db.test.find({ (int) "value" :{$gt : 12} });

素晴らしいことだ。のようなクエリ

db.test.find({"value" :{$gt : 12} }); // without the quotes around "12"

何も返しません。

4

5 に答える 5

24

次のJavaScript 式を使用できます。

db.test.find("this.value > 12")

これは、文字列から数値への JavaScript の自動変換を使用します。

于 2010-08-19T12:26:25.820 に答える
5

同様の回避策があります.mongoシェルを使用できる場合は、javascriptでこれを行うステートメントを記述できますが、インデックスを使用できます。

var myItems = []
var it = db.test.find({},{value:1})
while (it.hasNext()){
 var item = it.next();
 if(parseInt(item.value) > 12)
  myItems.push(item);
}

これを以前のソリューションよりも高速に実行する場合は、値フィールドのインデックスを確認する必要があります。

于 2013-01-16T01:48:50.030 に答える
2

String を int に変換するには、これを使用します

db.test.find({'year': {$type: 2}}).forEach(
    function (x) {
        x.value=new NumberInt(x.value); 
        db.test.save(x)}
    )

その後、次のように直接クエリできます。

db.test.find({"value" :{$gt : 12} });
于 2015-09-23T06:43:43.120 に答える
1

MongoDB での型キャストは、バージョン >= 以降で利用できます4.0。MongoDB の集計演算子$convertおよび類似の演算子を確認します。stringに変換したかったので、int次を使用できます$toInt

db.collection.find({ $expr: { $gt: [ { $toInt: "$value" }, 12 ] } })

テスト: mongoplayground

ノート :

ここvalueでは、stringフィールドintであるをオンザフライで変換しています & に変換されたのでint- タイプの入力と比較していますint。出力ドキュメントには、valueフィールドの元のタイプが引き続き含まれstringます (実際には応答ドキュメントのタイプを変更しません。必要に応じて集計を使用し、応答ドキュメントのフィールドの値$projectを確認する段階です)。intvalue

で集計演算子を使用している.find()ため、すべてを でラップする必要があります$expr

これは最近ではかなり一般的で簡単に実行できますが、読み取りごとにキャストstringintていることを覚えておいてください。書き込みまたは更新でこれを処理できれば、簡単で効率的です。

于 2020-06-03T17:21:16.400 に答える
0

$gt は、このユース ケースでは設定されませんでした。文字列には正規表現を使用する必要があります。おそらく、数値を数値として使用して新しいフィールドを作成する方が簡単です。

于 2010-08-19T12:16:28.617 に答える