首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB,如何在嵌套(?)中按名称查找对象从java中的osm导入数据库

MongoDB,如何在嵌套(?)中按名称查找对象从java中的osm导入数据库
EN

Stack Overflow用户
提问于 2013-10-21 21:18:15
回答 1查看 535关注 0票数 1

我读过很多关于在java编程中使用MongoDB以及在其中找到嵌套对象的主题。不幸的是,我没有找到我的问题的答案。我有一个数据库,这是从开放的街道地图导入。它包含许多不同的节点。我已经做了id全文搜索,它工作,但我必须有另一个搜索算法,只找到城市和村庄。我想,如果用户只输入一个单词,当我使用findOne方法按“名称”进行搜索时,它可能会起作用。

这是我的数据库示例,这是一条记录:

代码语言:javascript
复制
 > 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"
        ] }

这是我的代码,它不能工作。

代码语言:javascript
复制
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,我不知道如何通过名称来查找记录。求求你帮帮我。

EN

回答 1

Stack Overflow用户

发布于 2013-10-24 19:24:28

您的"name“字段在另一个数组的数组中-您需要进入该数组才能找到匹配的字段。

在您给出的示例中,您需要"tg.0.4.name“-因为它是初始数组的第一个元素的子数组的第五个元素中的name元素:

代码语言:javascript
复制
{
  "_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
}

请注意,您的路径中不需要" nodes“- nodes是集合的名称,因此coll.findOne将已经在nodes集合中查找。

代码语言:javascript
复制
cmd.put("tg.0.4.name", reqTab[0]);
DBObject resultTemp = coll.findOne(cmd);

但请注意,如果name字段不在第五个数组中,这将不起作用。您可以使用$elemMatch检查数组中的子文档中的值,但不能检查字段名。因此,如果您想要查询字段名,您可能会发现您必须重新构造文档。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19495651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档