2017-12-28 7 views
0

In MongoDB-Dokumentation schlagen sie vor, ObjecId für manuelle Verweise zu verwenden. siehe https://docs.mongodb.com/manual/reference/database-references/#document-referencesVerwendung von ObjectId als String in Java (Manuelle Referenz) mit Spring-Daten mongodb

original_id = ObjectId() 

db.places.insert({ 
    "_id": original_id, 
    "name": "Broadway Center", 
    "url": "bc.example.net" 
}) 

db.people.insert({ 
    "name": "Erin", 
    "places_id": original_id, 
    "url": "bc.example.net/Erin" 
}) 

Ich verwende Feder-data-mongodb und was ich suche ist haben eine Menschen Klasse wie folgt definiert:

@Document 
public class People { 

    private String name; 
    @Reference // or any Annotation to convert an ObjectId to a String 
    private String placesId; 
    private String url; 
} 

Wie eine "orte_id" als ObjectId in mongoDB haben, aber in unserem POJO einem String zugeordnet?

Ich hatte erwartet, eine Anmerkung wie @Reference zu haben, aber es scheint nicht implementiert zu werden.

Ich verstehe nicht, warum wir diese Art von Annotation nicht im Frühjahr-Daten-Mongong haben. Ich möchte keinen expliziten Konverter wie in spring documentation vorgeschlagen für alle Dokumente implementieren, die manuelle Referenzen verwenden. Vielleicht ist es nicht der richtige Ansatz.

Habe ich etwas übersehen?

UPDATE:

Ich mag die Idee, ein POJO haben nur String statt ObjectId verwenden. Lassen Sie uns sagen, dass ich eine Klasse Platz wie diese haben:

@Document 
public class Place { 
    @Id 
    private String id; 
    private String name; 
} 

place.getId() ein String sein, aber people.getPlaceId() wird ein ObjectId sein. Ich möchte diese unnötige Zuordnung vermeiden.

Antwort

0

Warum lassen Sie das Feld nicht als ObjectId?

@Document 
public class People { 

    private String name; 
    private ObjectId placesId; 
    private String url; 
} 

Wenn Sie dieses Feld abfragen möchten, können Sie dies tun:

  • Für Listen

    List<String> ids // the ids as strings 
    List<ObjectId> objIds = ids .stream() 
              .map(i -> new ObjectId(i)) 
              .collect(Collectors.toList()); 
    
  • Für einzelne String

    String id // single id 
    ObjectId objId = new ObjectId(id); 
    
+0

Dank Alex. Ich habe meine Frage mit weiteren Details aktualisiert, weil ich diese Zuordnung vermeiden möchte. Aber was du vorschlägst, ist zu arbeiten. –

+0

Leider gibt es noch keine spezifische Annotation. Nur das Feld ['_id' wird in der Mapping-Ebene behandelt (https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo-template.id-handling). _Wenn Sie den MappingMongoConverter verwenden, gibt es bestimmte Regeln, die regeln, wie Eigenschaften aus der Java-Klasse diesem _id-Feld zugeordnet werden. –

+0

Sie könnten jedoch nachsehen, wie Sie den 'MappingMongoConverter' anpassen –

0

Wenn Sie einen echten Verweis auf ein anderes Objekt in Ihrer Datenbank erstellen möchten, verwenden Sie die @DBRef Annotation, die von Spring Data bereitgestellt wird.

Ihre aktualisierte Code könnte wie folgt aussehen:

@Document 
public class People { 

    private String name; 

    @DBRef 
    private Place place; 
    private String url; 
} 

Spring Data wird dann automatisch ein Place Objekt in den People Objekt abzubilden. Intern wird dies mit einem Verweis auf das eindeutige gemacht. Probieren Sie diesen Code aus und schauen Sie sich Ihre Mongo-Datenbank an.

Weitere Informationen erhalten Sie unter: MongoDb with java foreign key

Verwandte Themen