TL; DR我希望將對象列表推送到mongodb中的數組;這個數組嵌套在一個嵌入的子文檔中,我不知道如何訪問這個數組,而不先從數據庫中檢索整個主文檔。通過Morphia(MongoDB)推送到嵌入式子文檔中的數組012(3)
首先,我的主要實體:
@Entity("trackers")
public class Tracker {
@Id
private ObjectId id;
private String ican;
@Embedded
private List<Day> days;
//getters, setters & constructors
}
的一天物體看起來是這樣的:
@Embedded
public class Day {
private LocalDate date;
@Embedded
private List<GeoStamp> geoStamps;
//getters, setters & constructors
}
最後,一個geostamp物體看起來是這樣的:
@Embedded
public class GeoStamp {
private Date dateTime;
private double latitude;
private double longitude;
//getters, setters & constructors
}
現在,在我的數據庫中,最終看起來像這樣:
{
"_id" : ObjectId("58ee636b44e7ed48200ee8d4"),
"className" : "com.model.Tracker",
"ican" : "NL 12346",
"days" : [
{
"date" : ISODate("2017-04-11T22:00:00Z"),
"geoStamps" : [
{
"dateTime" : ISODate("2017-04-12T17:27:07.249Z"),
"latitude" : 23.2222,
"longitude" : 44.333
},
{
"dateTime" : ISODate("2017-04-12T17:27:07.249Z"),
"latitude" : 23.2222,
"longitude" : 44.333
},
{
"dateTime" : ISODate("2017-04-12T17:27:07.249Z"),
"latitude" : 23.2222,
"longitude" : 44.333
}
]
},
{
"date" : ISODate("2017-01-01T23:00:00Z"),
"geoStamps" : [
{
"dateTime" : ISODate("2017-04-12T17:27:07.249Z"),
"latitude" : 23.2222,
"longitude" : 44.333
},
{
"dateTime" : ISODate("2017-04-12T17:27:07.249Z"),
"latitude" : 23.2222,
"longitude" : 44.333
},
{
"dateTime" : ISODate("2017-04-12T17:27:07.249Z"),
"latitude" : 23.2222,
"longitude" : 44.333
}
]
}
]
}
現在我想要做的是將GeoStamps列表推送到Mongo中的GeoStamp數組中,我首先在跟蹤器的ObjectId或其ican上進行過濾。然後在發現的文檔中,我需要按天過濾,因此我不會將GeoStamp列表添加到分佈在多個日期的多個GeoStamp陣列中。
我認爲是能夠做到這一點的方式如下:
我的查詢(是的,我知道retrievedFields已被棄用,我寧可不使用它,但是這是我的解決方案,它最接近於工作) :
final Query<Tracker> trackerQuery = datastore.find(Tracker.class)
.filter("_id", id)
.filter("days.date", LocalDate.now())
.retrievedFields(true, "days.$");
我updateOperations(newGeoStamps是GeoStamp對象列表中添加):
final UpdateOperations<Tracker> trackerUpdate = datastore.createUpdateOperations(Tracker.class).push("days.geoStamps", newGeoStamps);
最後,updateResults:
final UpdateResults trackerUpdateResults = datastore.update(trackerQuery, trackerUpdate);
這將引發與以下錯誤WriteConcernException:
Write failed with error code 16837 and error message 'cannot use the part (days of days.geoStamps) to traverse the element ({days: [ { date: new Date(1491948000000), geoStamps: [ { dateTime: new Date(1492019739661), latitude: 23.2222, longitude: 44.333 }, { dateTime: new Date(1492019739661), latitude: 23.2222, longitude: 44.333 }, { dateTime: new Date(1492019739661), latitude: 23.2222, longitude: 44.333 } ] }, { date: new Date(1483311600000), geoStamps: [ { dateTime: new Date(1492019739661), latitude: 23.2222, longitude: 44.333 }, { dateTime: new Date(1492019739661), latitude: 23.2222, longitude: 44.333 }, { dateTime: new Date(1492019739661), latitude: 23.2222, longitude: 44.333 } ] } ]})'
您在錯誤中看到的緯度和經度是那些我試圖插入。
有關如何完成此任何想法?