1

MongoDB は、単純なクエリを送信するために単純な REST インターフェイスを提供します。問題は、クエリ時に型を指定する方法がわからないことです。例えば:

コレクションにこのドキュメントがあるとします。

 { "_id" : { "$oid" : "51ae1042c92ba30ae0afa26f" }, "serialNumber" : "4661016803", "clientPayload" : { "$binary" : "gwVGYQFoAwEBAQJJkFGj839Ro/N/GcfKG8l89gcAAHvNAAAAAAFDCwADAv+lLwkfAAEACAAAPqQHAAAw7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", "$type" : "00" }, "receiveTime" : { "$date" : 1369717200070 } }

serialNumber でクエリを実行するにはどうすればよいですか?

私はしようとしています

http://xxx.x.x.x:xxxx/test/stuff/?filter_serialNumber=4661016803

しかし、どうやらクエリを実行しているようです "query" : { "serialNumber" : 4661016803 }

私が欲しい"query" : { "serialNumber" : "4661016803" }

4

1 に答える 1

5

私の知る限り、値の型を指定することはできません。これはバグまたは制限のようです。要求された値が数字で始まる場合、文字列ではなく数値として解釈されます。

例: "abc" -> "abc", "1abc" -> 1, "123" - 123.

更新: ソース \mongodb-src-r2.4.4\src\mongo\db\restapi.cpp を調べました:

BSONElement e = i.next();
string name = e.fieldName();
if ( ! name.find( "filter_" ) == 0 )
    continue;

string field = name.substr(7);
const char * val = e.valuestr();

char * temp;

// TODO: this is how i guess if something is a number.  pretty lame right now
double number = strtod( val , &temp );
if ( temp != val )
    queryBuilder.append( field , number );
else
    queryBuilder.append( field , val );
}

TODO コメントとstrtod関数を見てください。これがバグです。

于 2013-06-04T19:56:51.200 に答える