如何在mongodb中获取文档的所有父母和子女

时间:2014-12-08 10:10:41

标签: mongodb mongodb-query mongodb-java

我最近开始研究mongodb。我的简单应用程序将具有像

这样的Geo层次结构

Continet - >国家 - >地区--->度假村 - >住宿

我的数据将是这样的

 {
    "_id" : ObjectId("54854d5af2ef42fe7d4d2a44"),
    "name" : "Europe",
    "parent" : "",
    "type" : "Continent",
    "synonym" : "",
    "code" : "EEE"
}
{
    "_id" : ObjectId("54854d5af2ef42fe7d4d2a47"),
    "name" : "Bulgaria",
    "parent" : "EEE",
    "type" : "Country",
    "synonym" : "",
    "code" : "BGR"
}
{
    "_id" : ObjectId("54854d5af2ef42fe7d4d2a45"),
    "name" : "Albania",
    "parent" : "EEE",
    "type" : "Country",
    "synonym" : "",
    "code" : "ALB"
}
{
    "_id" : ObjectId("54854d5af2ef42fe7d4d2a48"),
    "name" : "Bourgas Region",
    "parent" : "BGR",
    "type" : "Region",
    "synonym" : "",
    "code" : "002682"
}
{
    "_id" : ObjectId("54854d5af2ef42fe7d4d2a49"),
    "name" : "Obzor",
    "parent" : "002682",
    "type" : "Resort",
    "synonym" : "",
    "code" : "002911"
}
{
    "_id" : ObjectId("54854d5af2ef42fe7d4d2a4a"),
    "name" : "Sunny Beach",
    "parent" : "002682",
    "type" : "Resort",
    "synonym" : "",
    "code" : "002548"
}
{
    "_id" : ObjectId("54854d5af2ef42fa7d4d2b3d"),
    "name" : "Hotel Park Avenue",
    "parent" : "002548",
    "type" : "Accommodation",
    "synonym" : "",
    "code" : "022548"
}

如上所示,每个文档中只有直接父母。

现在我必须让所有的父母和孩子都使用“代码”:“002548”

如果我有度假村代码,我必须获得所有住宿,其中有相应的度假村作为父母,我必须得到度假村所属的目的地,国家,大陆。

我觉得应该有递归查询才能得到这个,我使用MongoTemplate进行数据库操作。

请帮助我为此获得最佳解决方案。

提前致谢。

2 个答案:

答案 0 :(得分:2)

mongodb不支持联接,因此您必须执行多个查询才能使用该层次结构。

答案 1 :(得分:0)

了解您在这些文档上运行的查询类型会有所帮助,但我猜测感兴趣的级别为ResortAccomodation。您已将较高的三个级别构建为单独的文档,但在我看来,它们是ResortsAccomodations的属性:Resort位于给定区域,国家/地区,大陆。此外,地区,国家和大陆不会发生太大变化。我认为更高级别的地理信息是嵌入ResortAccommodation文档的理想选择:

{
    "_id" : ObjectId("54854d5af2ef42fa7d4d2b3d"),
    "name" : "Hotel Park Avenue",
    "type" : "Accommodation",
    "synonym" : "",
    "code" : "022548",
    "region" : "New York",
    "country" : "United States",
    "continent" : "North America"
}

通过这种结构,找到父母"像上面这样的住宿只是看地区,国家,大陆的价值观。寻找孩子"例如,一个国家是一个简单的查询:

db.stuff.find({ "country" : "United States" })