我正在测试一个基于酒店搜索的场景。所以我做了3个模型类,分别是酒店、房间和可用性
下面是我们正在使用的三个模型类。
Hotel.java
@文档(集合="酒店")公共类酒店{
@Id
private String id;
private String name;
private Long pincode;
@Field("roomCategoryDocs")
private Object roomCategoryDocs;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getPincode() {
return pincode;
}
public void setPincode(Long pincode) {
this.pincode = pincode;
}
public Object getRoomCategoryDocs() {
return roomCategoryDocs;
}
public void setRoomCategoryDocs(Object roomCategoryDocs) {
this.roomCategoryDocs = roomCategoryDocs;
}
@Override
public String toString() {
return String.format("Hotel [id=%s, name=%s, pincode=%s, roomCategoryDocs=%s]", id, name, pincode,
roomCategoryDocs);
}
}
Room.java
@文件(收集=“房间”)公共教室{
@Id
private String id;
private String frontImg;
private String category;
private ObjectId hotelId;
@Field("availabilityDocs")
private Object availabilityDocs;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getFrontImg() {
return frontImg;
}
public void setFrontImg(String frontImg) {
this.frontImg = frontImg;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public ObjectId getHotelId() {
return hotelId;
}
public void setHotelId(ObjectId hotelId) {
this.hotelId = hotelId;
}
public Object getAvailabilityDocs() {
return availabilityDocs;
}
public void setAvailabilityDocs(Object availabilityDocs) {
this.availabilityDocs = availabilityDocs;
}
@Override
public String toString() {
return String.format("Room [id=%s, frontImg=%s, category=%s, hotelId=%s, availabilityDocs=%s]", id, frontImg,
category, hotelId, availabilityDocs);
}
}
可利用性Java语言
@文件(收集=“房间”)公共类可用性{
@Id
private String id;
private ObjectId roomId;
private Integer availability;
private Double rate;
private String date;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public ObjectId getRoomId() {
return roomId;
}
public void setRoomId(ObjectId roomId) {
this.roomId = roomId;
}
public Integer getAvailability() {
return availability;
}
public void setAvailability(Integer availability) {
this.availability = availability;
}
public Double getRate() {
return rate;
}
public void setRate(Double rate) {
this.rate = rate;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
@Override
public String toString() {
return String.format("Availability [id=%s, roomId=%s, availability=%s, rate=%s, date=%s]", id, roomId,
availability, rate, date);
}
}
这些存储在两个mongodb集合中,一个用于酒店,另一个用于房间和可用性。
下面是我们从中提取数据的控制器类的方法
@GetMap(value="/hotel")公共列表getAllHotel(){
Aggregation agg = newAggregation(match(Criteria.where("pincode").lt(800080)),
lookup("rooms", "_id", "hotelId", "roomCategoryDocs"), unwind("roomCategoryDocs", true),
lookup("rooms", "roomCategoryDocs._id", "roomId", "roomCategoryDocs.availabilityDocs"),
unwind("roomCategoryDocs", true),
group("_id").first("name").as("name").last("pincode").as("pincode").push("roomCategoryDocs").as("roomCategoryDocs")
);
// Convert the aggregation result into a List
AggregationResults<Hotel> groupResults = mongoTemplate.aggregate(agg, "Hotels", Hotel.class);
List<Hotel> result = groupResults.getMappedResults();
return result;
}
现在,在获取酒店数据的同时,我们正在获取房间和可用性的所有数据。
我们获得的产出:
[
{
"id": "59fabce1acd8be143417b101",
"name": "Elegance",
"pincode": 700042,
"availabilityDocs": [
{
"id": "59fabe39acd8be143417b103",
"frontImg": "google.com/1234",
"category": "Deluxe",
"hotelId": {
"timestamp": 1509604577,
"machineIdentifier": 11327678,
"processIdentifier": 5172,
"counter": 1552641,
"timeSecond": 1509604577,
"time": 1509604577000,
"date": 1509604577000
},
"availabilityDocs1": [
{
"id": "59fabf66acd8be14344a2df3",
"roomId": {
"timestamp": 1509604921,
"machineIdentifier": 11327678,
"processIdentifier": 5172,
"counter": 1552643,
"timeSecond": 1509604921,
"time": 1509604921000,
"date": 1509604921000
},
"availability": 10,
"rate": 4000,
"date": "2017-10-11"
},
{
"id": "59fae259acd8be264cf4430f",
"roomId": {
"timestamp": 1509604921,
"machineIdentifier": 11327678,
"processIdentifier": 5172,
"counter": 1552643,
"timeSecond": 1509604921,
"time": 1509604921000,
"date": 1509604921000
},
"availability": 11,
"rate": 4001,
"date": "2017-10-12"
}
]
}
]
}
]
但现在我们陷入了一个问题,那就是基于日期属性进行搜索。
预期输出:
这里我们只想获取2017年11月10日的数据。
{
"id": "59fabce1acd8be143417b101",
"name": "Elegance",
"pincode": 700042,
"availabilityDocs": [
{
"id": "59fabe39acd8be143417b103",
"frontImg": "google.com/1234",
"category": "Deluxe",
"hotelId": {
"timestamp": 1509604577,
"machineIdentifier": 11327678,
"processIdentifier": 5172,
"counter": 1552641,
"timeSecond": 1509604577,
"time": 1509604577000,
"date": 1509604577000
},
"availabilityDocs1": [
{
"id": "59fabf66acd8be14344a2df3",
"roomId": {
"timestamp": 1509604921,
"machineIdentifier": 11327678,
"processIdentifier": 5172,
"counter": 1552643,
"timeSecond": 1509604921,
"time": 1509604921000,
"date": 1509604921000
},
"availability": 10,
"rate": 4000,
"date": "2017-10-11"
}
}
以下是json集合示例Hotels集合:
{“\u id”:ObjectId(“59fabce1acd8be143417b101”),“name”:“优雅”,“pincode”:NumberLong(700042),“\u class”:“com.lara.mongodb.domain.Hotel”}
房间收集示例:
{“\u id”:ObjectId(“59fabf66acd8be14344a2df3”),“roomId”:ObjectId(“59fabe39acd8be143417b103”),“availability”:10,“rate”:4000,“date”:“2017-10-11”,“\u class”:“com.lara.mongodb.domain.availability”}
我愿意接受任何关于设计的建议和任何其他你可能有的想法,因为我是新手。任何帮助都将不胜感激。非常感谢。
老实说,我有点不明白你是如何在同一个集合中编写两个实体的。从你添加的示例集合中,我可以看出缺少一个。但是撇开这个不谈。我使用你的最终结果作为切入点。所以我从以下开始:
{
"id": "59fabce1acd8be143417b101",
"name": "Elegance",
"pincode": 700042,
"availabilityDocs": [
{
"id": "59fabe39acd8be143417b103",
"frontImg": "google.com/1234",
"category": "Deluxe",
"hotelId": {
"timestamp": 1509604577,
"machineIdentifier": 11327678,
"processIdentifier": 5172,
"counter": 1552641,
"timeSecond": 1509604577,
"time": 1509604577000,
"date": 1509604577000
},
"availabilityDocs1": [
{
"id": "59fabf66acd8be14344a2df3",
"roomId": {
"timestamp": 1509604921,
"machineIdentifier": 11327678,
"processIdentifier": 5172,
"counter": 1552643,
"timeSecond": 1509604921,
"time": 1509604921000,
"date": 1509604921000
},
"availability": 10,
"rate": 4000,
"date": "2017-10-11"
},
{
"id": "59fae259acd8be264cf4430f",
"roomId": {
"timestamp": 1509604921,
"machineIdentifier": 11327678,
"processIdentifier": 5172,
"counter": 1552643,
"timeSecond": 1509604921,
"time": 1509604921000,
"date": 1509604921000
},
"availability": 11,
"rate": 4001,
"date": "2017-10-12"
}
]
}
]
}
这是你做聚合后的结果。现在您只需要2017-10-11可用的房间。但在结果数组中,您可以同时获得“2017-10-12”和“2017-10-11”。
因此,如果我有上述结果,你必须添加以下内容:
{
$unwind: "$availabilityDocs"
},
{
$unwind: "$availabilityDocs.availabilityDocs1"
},
{
$match: {
"availabilityDocs.availabilityDocs1.date" : "2017-10-11"
}
}
我试图从我的数据库中提取一个值。我有一个收藏叫:randoms模型的名字:Random 在集合中,我有一个对象和一个名称字段。我想检索“name”的值并将其显示在控制台中。 控制台中的结果应为:“TestName”。 这是我的方法: 控制台显示结果:未定义。 这是数据库。 如果我控制台.log(随机)而不是控制台.log(randoms.name)我得到的结果: 这意味着连接是正常的。
问题内容: 我有一个带有多个对象的集合“ companies”。每个对象都有“ _id”参数。我正在尝试从数据库获取此参数: 因此,我请求公司/ 4fcfd7f246e1464d05000001(4fcfd7f246e1464d05000001是我需要的对象的_id- parma),并且findOne不返回任何内容,这就是为什么console.log(’该公司没有数据’); 执行。 我绝对确定我有
我想通过“id”从我的mongodb获取数据。如果我的id与mongodb中id的值匹配,则它将获取该对象,但其抛出错误为: {“message”:“对于模型“PostMessage”“”的路径“\u id”处的值“s-CoAhDKd”,转换为ObjectId失败}
我有一个neo4j数据库,其中存储了一些带有索引“航点”的点,我想在传递一些点后动态获取一些点。为此,我创建了占位符{name1}, 但是使用动态参数调用getWayPointByName时
我有maven生成的Spring项目和我的JSP插件。jsp在/target/m2e wtp/web资源中,它看起来像这样: 控制器位于/src/main/java/com/mypackage/web/InsertBook中。java和代码如下: 以及servlet上下文。此处的xml代码: 我得到消息表单tomcat服务器,当试图访问这个JSP: 有谁能告诉我,如何通过控制器访问JSP表单中填写
我希望从ES中获得聚合结果,例如,对于与术语匹配的文档,