2017-04-12 6 views
0

TL; DRオブジェクトのリストをmongodbの配列にプッシュしたいと思います。この配列は埋め込まれたサブ文書にネストされています。データベースからメイン文書全体を最初に取得することなく、この配列に到達する方法はわかりません。モルフィア(MongoDB)を介して埋め込みサブ文書の配列にプッシュ

まず、私の主なエンティティ:

@Entity("trackers") 
public class Tracker { 

    @Id 
    private ObjectId id; 
    private String ican; 
    @Embedded 
    private List<Day> days; 

    //getters, setters & constructors 
} 

A Dayオブジェクトは、次のようになります。

@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 
       } 
      ] 
     } 
    ] 
} 

ここで私がしたいことは、MongoのGeoStamp配列にGeoStampのリストをプッシュすることです。まず、TrackerのObjectIdまたはそのicanのいずれかをフィルタリングします。発見された文書の中で、私は1日にフィルタリングする必要があるので、複数の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); 

が、これは将来的に誰かを助けるかもしれない願っています!

関連する問題