0

mongodb + Java ドライバーを使用しているときに、奇妙な出来事に遭遇しました。グループ化クエリを実行すると、キーのデータ型が int から double に変わります。

(つまり、すべてのオブジェクト内に int として格納されている「hours」のキーをグループ化していますが、返される結果ではキーが double 型に変わります)。

それは大きな問題ではありません...しかし、そのようなキーと値のペアのデータ型を勝手に変更するのは奇妙です。他の誰かがこれを思いついたことがありますか?これは正常な動作ですか?

ありがとう、

ps 通常の .find() クエリを実行すると、正しいデータ型 fyi が返されます。

編集:いくつかのサンプルコード:

import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.QueryOperators;

public class MongoTestQueries {

private static final String TESTDBNAME = "badgerbadgerbadger";
private static final String TESTCOLNAME = "mushroom";
private static final Long TESTMAX = 50L;

private static final String KEY1 = "a";
private static final String KEY2 = "snake";
private static final String KEY3 = "plane";

/**
 * This starts running it.
 * 
 * @param args
 *            the arguments.
 */
public static void main(final String[] args) {
//You'll need to write your own code here for connecting to db as you see fit.
    MongoConnection mc = new MongoConnection("someserver.com", TESTDBNAME);
    mc.setCurCol(TESTCOLNAME);
    mc.getCurCol().drop();
    mc.setCurCol(TESTCOLNAME);


    DBCollection col = mc.getCurCol();

    populateCollection(col);
    System.out.println(col.count() + " inserted into db.");

    regGroupSearch(col);

}

private static void populateCollection(DBCollection col) {
    for (Long l = 0L; l < TESTMAX; l++) {
        col.insert(new BasicDBObject(KEY1, new Integer(l.intValue())).append(KEY2,
                Math.random()).append(KEY3, (TESTMAX - l) + "a string"));
    }
}

private static void regGroupSearch(final DBCollection col) {
    System.out.println("Group Search:");
    DBObject key = new BasicDBObject(KEY1, true).append(KEY3, true);
    DBObject cond = new BasicDBObject().append(KEY1, new BasicDBObject(QueryOperators.GT, 4.0));
    DBObject initial = new BasicDBObject("count", 0).append("sum", 0);
    String reduce = "function(obj,prev){prev.sum+=obj." + KEY2 + ",prev.count+=1}";
    String finalize = "function(obj){obj.ave = obj.sum/obj.count}";
    DBObject groupResult = col.group(key, cond, initial, reduce, finalize);
    printDBObject(groupResult);
    System.out.println("Done.");
}

private static void printDBObject(final DBObject toPrint) {
    for (String k : toPrint.keySet()) {
        System.out.println(k + ": " + toPrint.get(k));
    }
}

}

4

0 に答える 0