通过REST,Spring访问MongoDB中的嵌套数据

时间:2017-02-20 09:54:53

标签: java spring mongodb rest

类似于我之前的question,我正在尝试使用Spring REST访问MongoDB中的数据。

我有简单的键值对的集合,可以访问那些罚款。

{
    "_id" : ObjectId("5874ab4a19b38fb91fbb234f"),
    "roID" : "7ed3f9a6-bb9b-4d16-8d1a-001b7ec40b51",
    "Name" : "[REDACTED]"
}

问题是,这些对象在另一个集合中使用,它显示了它们之间属性的关系,如下所示:

{
    "_id" : ObjectId("5874ab4f19b38fb91fbb6180"),
    "[OBJECT CATEGORY A]" : {
        "_id" : ObjectId("5874ab4a19b38fb91fbb257b"),
        "roID" : "72f8a8b5-71a7-40ac-b1ac-1ffc98a507ba",
        "Name" : "[REDACTED]"
    },
    "[OBJECT CATEGORY B]" : {
        "_id" : ObjectId("5874ab4b19b38fb91fbb32a3"),
        "roID" : "919446ab-1898-419f-a704-e8c34985f945",
        "Name" : "[REDACTED]"
    },
    "[RELATIONSHIP INFORMATION]" : [ 
        {
            "[PROPERTY A]" : [ 
                {
                    "[VALUE A]" : 5.0
                }, 
                {
                    "[VALUE B]" : 0.0
                }
            ]
        }, 

属性介于8到20之间。

Java中第一个(普通)对象的定义如下所示:

@Document(collection="OBJ")
public class Obj {

    public Obj(){};

    @Id
    public String id;

    @Field("roID")
    public String roID;

    @Field("Name")
    public String name;

}

存储库类:

@RepositoryRestResource(collectionResourceRel = "OBJ", path = "OBJ")
public interface ObjRepo extends MongoRepository<Obj, String> {

    List<Obj> findByName(@Param("name") String name); 
}

问题是:如何访问嵌套对象?我尝试使用LinkedHashMap代替复杂集合的字符串,当我尝试访问它时,curl只返回“null”。我尝试定义一个类

public class BITS {
    @Id
    private String _id;
    @Field("roID")
    private String roID;
    @Field("Name")
    private String name;

    public BITS(){}

    public BITS(String _id,String roID, String name){
        this._id = _id;
        this.roID = roID;
        this.name = name;
    }

}

访问这些对象,但未成功。

1 个答案:

答案 0 :(得分:0)

原来,班级方法是正确的,只是没有很好地执行。 我为测试目的创建了一个普通的JSON集合:

@Document(collection="JSON")
public class JSON {

    @Id
    public String id;

    @Field("squares")
    public Square square;

    @Field("dots")
    public Dot dot;

    public JSON(){};
    public JSON(String id, Square square,Dot dot){
        this.id = id;
        this.square = square;
        this.dot = dot;
    };


}

Square.java

public class Square {

    private String id;
    private int x;
    private int y;

    public Square(){};

    public Square(String id,int x, int y){
        this.id = id;
        this.x = x;
        this.y = y;
    };

    public Map<String, Integer> getSquare()
    {
    Map<String, Integer> res = new HashMap<>();
    res.put("x", x);
    res.put("y", y);
    return res;
}

}

(点是相同的,只是为了测试) 因此,尽管它已经在数据库中采用了这种格式,但它只是完全重新构建了所需的响应。 如果有人能指出我可以从响应中删除杂乱的地方,那就太好了。目前看起来像这样:

"_embedded" : {
    "JSON" : [ {
      "square" : null,
      "dot" : {
        "dot" : {
          "x" : 4,
          "y" : 3
        }
      },
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/JSON/58ac466160fb39e5e8dc8b70"
        },
        "jSON" : {
          "href" : "http://localhost:8080/JSON/58ac466160fb39e5e8dc8b70"
        }
      }
    }, {
      "square" : {
        "square" : {
          "x" : 12,
          "y" : 2
        }
      },
      "dot" : null,
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/JSON/58ac468060fb39e5e8dc8b7e"
        },
        "jSON" : {
          "href" : "http://localhost:8080/JSON/58ac468060fb39e5e8dc8b7e"
        }
      }
    } ]
  },
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/JSON"
    },
    "profile" : {
      "href" : "http://localhost:8080/profile/JSON"
    }
  },
  "page" : {
    "size" : 20,
    "totalElements" : 2,
    "totalPages" : 1,
    "number" : 0
  }
}