MongoDB,如何在java中从osm导入的嵌套(?)DB中按名称查找对象
我读过很多关于在java编程中使用MongoDB以及在其中查找嵌套对象的主题。不幸的是,我没有找到我问题的答案。我有一个数据库,它是从开放的街道地图导入。它包含许多不同的节点。我已经为id做了全文搜索,它是有效的,但我必须有另一个搜索算法,只找到城市和村庄。我想,如果用户只键入一个单词,当我使用MongoDB,如何在java中从osm导入的嵌套(?)DB中按名称查找对象,java,mongodb,openstreetmap,Java,Mongodb,Openstreetmap,我读过很多关于在java编程中使用MongoDB以及在其中查找嵌套对象的主题。不幸的是,我没有找到我问题的答案。我有一个数据库,它是从开放的街道地图导入。它包含许多不同的节点。我已经为id做了全文搜索,它是有效的,但我必须有另一个搜索算法,只找到城市和村庄。我想,如果用户只键入一个单词,当我使用findOne方法按“名称”搜索时,它可能会起作用 这是我的数据库示例,这是一条记录: > db.nodes.findOne() { "_id" : NumberLong(2365
findOne
方法按“名称”搜索时,它可能会起作用
这是我的数据库示例,这是一条记录:
> 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;
if(reqTab.length==1&&req.getHowMany()您的“name”字段位于另一个数组中的数组中-您需要进入该数组以查找匹配字段
在您给出的示例中,您需要“tg.0.4.name”-因为它是初始数组的第一个元素的子数组的第5个元素中的name元素:
{
"_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
}
请注意,如果名称字段不在第五个数组中,则此操作将不起作用。您可以使用来检查数组中的子文档中的值,但不能检查字段名称。因此,如果要查询字段名称,您可能会发现您必须重新构造文档。您的“名称”字段位于另一个数组中的一个数组中-您需要进入该数组以找到匹配的字段
在您给出的示例中,您需要“tg.0.4.name”-因为它是初始数组的第一个元素的子数组的第5个元素中的name元素:
{
"_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
}
请注意,如果名称字段不在第五个数组中,则此操作将不起作用。您可以使用检查数组中的子文档中的值,但不能检查字段名称。因此,如果要查询字段名称,您可能会发现必须重新构造文档