2017-04-12 92 views
0

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 } ] } ]})'

您在錯誤中看到的緯度和經度是那些我試圖插入。

有關如何完成此任何想法?

回答

0

原來我沒有真正推到一個數組,這樣的:

final UpdateOperations<Tracker> trackerUpdate = datastore.createUpdateOperations(Tracker.class).push("days.geoStamps", newGeoStamps); 

應該已經:

final UpdateOperations<Tracker> trackerUpdate = datastore.createUpdateOperations(Tracker.class) 
       .push("days.$.geoStamps", newGeoStamps); 

希望這可以幫助別人的未來!

相關問題