3

私が取り組んでいるプロジェクトでは、ある時点で、文字列から mongodb へのクエリを読み取りました。com.mongodb.util.JSON.parse(querystring)$max や $min などの演算子を含むクエリの読み取りを開始するまでは、正常に機能していたクエリの読み取りに使用していました。その時点で、mongodb の $max 演算子を使用する代わりに、パーサーは "$max" フィールドを作成します。例えば、

入力文字列:

{ $query : { state : "AL" } , $max : { pop : 9058 } }

DBObject に解析されます。

{ "$query" : { "state" : "AL"} , "$max" : { "pop" : 9058}}

次に、そのクエリ ドキュメントで DBCursor を探すと、おそらく "$query" または "$max" フィールドを持つドキュメントがないため、サイズ 0 のカーソルが表示されます (データベース内に一致するドキュメントが見つかりません)。

他に使えるものはありJSON.parse()ますか?私は独自の関数を書くことを嫌いませんが、$ 演算子をフィールドではなく演算子として認識する DBObject を取得するにはどうすればよいですか?

アドバイスをいただければ幸いです。

4

2 に答える 2

0

クエリ変更演算子 $max を使用する次のコード スニペットは、正常に動作するようです。

/* {$query:{state:"AL"}, "$max":{pop:10000}}*/
String s = "{$query:{state:\"AL\"}, \"$max\":{pop:10000}}";
DBObject dbObject = (DBObject) JSON.parse(s);
System.out.println("\nFind all: ");

DBCursor cursor = collection.find(dbObject);

try {
    while (cursor.hasNext()) {
        DBObject cur = cursor.next();
        System.out.println(cur);
    }
} finally {
   cursor.close();
}

ポップでインデックスを指定していることを確認してください。

db.zips.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "test.zips",
"name" : " id "
},
{
"v" : 1,
"key" : {
"pop" : 1
},
"ns" : "test.zips",
"name" : "pop_1"
}
]

詳しくは下記リンクをご覧ください。
http://docs.mongodb.org/manual/reference/operator/max/
集計演算子 $max または $min の使用に関心がある場合に備えて、次のリンクに詳細とサンプル コードが記載されています。
http://docs.mongodb.org/ecosystem/tutorial/use-aggregation-framework-with-java-driver/

于 2013-06-27T18:58:05.777 に答える
0

したがって、あきらめたDBObjectがうまく機能したことがわかります。サイズが 0、true のカーソルを返しますが、DBCursor の長さは実際に探していたものです。(以前は、カーソルのサイズが 0 かどうかをチェックし、0 の場合は null を返していました。)

サイズと長さの違いが DBCursor にあるのかどうかはよくわかりません (サイズとカウントの違いは明らかですが、長さがどうあるべきかはわかりません) が、現在は機能しています。上記の場合、サイズとカウントは両方とも 0 でしたが、長さは目的の数値でした。

于 2013-06-27T21:00:55.857 に答える