1

JavaプログラミングでMongoDBを使用し、ネストされたオブジェクトを見つけることに関する多くのトピックを読みました。残念ながら、私の質問に対する答えは見つかりませんでした。Open Street Map からインポートされたデータベースがあります。多くの異なるノードが含まれています。ID 全文検索を作成しましたが、機能しますが、都市と村のみを検索する別の検索アルゴリズムが必要です。findOneユーザーが単語を1つだけ入力する場合、「名前」で検索する方法を使用するとうまくいくかもしれないと思いました。

これが私のデータベースのサンプルです。これは 1 つのレコードです。

 > db.nodes.findOne() {
        "_id" : NumberLong(23658160),
        "loc" : [
                53.9475385,
                14.1787832
        ],
        "ch" : NumberLong(12846175),
        "ts" : "2012-08-24T15:07:41Z",
        "un" : "HHT",
        "ui" : NumberLong(498475),
        "v" : 9,
        "tg" : [
                [
                        "addr:city",
                        "Heringsdorf"
                ],
                [
                        "addr:housenumber",
                        "7-9"
                ],
                [
                        "addr:postcode",
                        "17424"
                ],
                [
                        "addr:street",
                        "Puschkinstraße"
                ],
                [
                        "name",
                        "Jugendherberge Heringsdorf"
                ],
                [
                        "tourism",
                        "hostel"
                ],
                [
                        "wheelchair",
                        "yes"
                ]
        ],
        "ky" : [
                "addr:city",
                "addr:housenumber",
                "addr:postcode",
                "addr:street",
                "name",
                "tourism",
                "wheelchair"
        ] }

ここに私のコードがありますが、うまくいきません。

if (reqTab.length == 1 && req.getHowMany() <= 1) 
{
    cmd.put("nodes.tg.name", reqTab[0]);
    DBObject resultTemp = coll.findOne(cmd);
    System.out.println(resultTemp); //here it shows null
    json = gson.toJson(resultTemp);                
}
else
{   //here it's all working!
    cmd.put("text", "nodes");
    cmd.put("search", req.getWhatToSearch());
    cmd.put("limit", req.getHowMany());
    result = db.command(cmd);
    json = gson.toJson(result);
}        
return json;

それは常にnullになります。名前でレコードを見つけるためにこれに入る方法がわかりません。助けてください。

4

1 に答える 1

1

「名前」フィールドは、別の配列内の配列内にあります。一致するフィールドを見つけるには、その配列に入る必要があります。

あなたが与えた例では、「tg.0.4.name」が必要です-これは、初期配列の最初の要素のサブ配列の5番目の要素の名前要素であるためです。

{
  "_id" : NumberLong(23658160),
  "loc" : [
          53.9475385,
          14.1787832
  ],
  "ch" : NumberLong(12846175),
  "ts" : "2012-08-24T15:07:41Z",
  "un" : "HHT",
  "ui" : NumberLong(498475),
  "v" : 9,
  "tg" :                        <-- Document field tg            (tg)
         [                      <-- Array.  This is element zero (tg.0)
          [                     <-- Sub array, element zero      (tg.0.0)
              "addr:city",
              "Heringsdorf"
          ],
          [                     <-- Sub array, element one       (tg.0.1)
              "addr:housenumber",
              "7-9"
          ],
          [                     <-- Sub array, element two       (tg.0.2)
              "addr:postcode",
              "17424"
          ],
          [                     <-- Sub array, element three     (tg.0.3)
              "addr:street",
              "Puschkinstraße"
          ],
          [                     <-- Sub array, element four      (tg.0.4)
              "name",           <-- Sub document, name           (tg.0.4.name)
              "Jugendherberge Heringsdorf"
          ],
  ... blah blah
}

パスに「ノード」は必要ないことに注意してください。ノードはコレクションの名前であるため、coll.findOne既にノード コレクションを検索しています。

cmd.put("tg.0.4.name", reqTab[0]);
DBObject resultTemp = coll.findOne(cmd);

ただし、名前フィールドが 5 番目の配列にない場合、これは機能しないことに注意してください。$elemMatchを使用して、配列内のサブドキュメントのをチェックできますが、フィールド名はチェックできません。したがって、フィールド名でクエリを実行する場合は、ドキュメントを再構築する必要がある場合があります。

于 2013-10-24T11:24:28.223 に答える