7

MongoDB でクエリされたドキュメントから値を取得できません。

たとえば、doc 構造は次のようになります。

    {
        "_id": {
            "$oid": "50f93b74f9eccc540b302462"
        },
       "response": {
            "result": {
                "code": "1000",
                "msg": "Command completed successfully"
            },
            "resData": {
                "domain:infData": {
                    "domain:name": "ritesh.com",
                    "domain:crDate": "2007-06-15T12:02:36.0000Z",
                    "domain:exDate": "2013-06-15T12:02:36.0000Z"
                }
            }
        }
    }

クエリコードは次のとおりです。

    DBCollection collection = db.getCollection("domains");

    BasicDBObject p = new BasicDBObject("response.resData.domain:infData.domain:name", "ritesh.com");
    DBCursor c = collection.find(p);

    while(c.hasNext()) {
        DBObject obj = c.next();
        Object value = obj.get("response.resData.domain:infData.domain:name");
    }

それは問題なくクエリを実行し、ドキュメントをフェッチしますが、DBObject (または c. next() は BasicDBObject 型を返します)。

次のように、一度に 1 つずつオブジェクトを取得できます。

    ((DBObject)obj.get("response")).get("resData")....

しかし、それは非常に面倒に思えます。

次のように BasicDBObject にネストされたフィールド値を put() できるので、私は考えました:

    basicDBObject.put("response.resData.domain:infData.domain:name", "ritesh.com");

同様に get() を使用して、同じ種類のキーを使用して BasicDBObject の結果から取得できることを確認しました。上記のコードで次のことを試みたように:

    Object value = obj.get("response.resData.domain:infData.domain:name");

しかし、それは null 値を返しています。

それはおそらく簡単なことですが、私にはそれを理解できないようです。そして、私がネットでチェックしたどこでも、例は結果からネストされていない値のみをフェッチします。お気に入り

    doc.get("name");

次のようなものの代わりに:

    doc.get("name.lastname.clanname");

どんな助けでも大歓迎です。ありがとう!

4

2 に答える 2

12

Java ドライバーを使用している場合のように、プロパティ名をチェーンする方法はありません ( gets 確かに、thisによれば、putどちらも機能しないはずです)。

あなたが提案したように、一度に1つずつオブジェクトを取得する必要があります。

((DBObject)obj.get("response")).get("resData")

構文が機能する可能性のある将来の機能については、こちらを参照してください (ただし、新しいメソッド名が使用される可能性があります)。

于 2013-01-19T02:57:10.660 に答える
8

私は同じ問題に遭遇し、チェーンされたプロパティを取得するための小さな関数を作成しました。

private Object getFieldFromCursor(DBObject o, String fieldName) {

    final String[] fieldParts = StringUtils.split(fieldName, '.');

    int i = 1;
    Object val = o.get(fieldParts[0]);

    while(i < fieldParts.length && val instanceof DBObject) {
        val = ((DBObject)val).get(fieldParts[i]);
        i++;
    }

    return val;
}

お役に立てば幸いです。

于 2013-11-12T11:54:15.943 に答える