Ho una domanda riguardante MongoDB con Spring Data. Ho questi classi di dominio:Gli oggetti incorporati MongoDB non hanno ID (valore null)
@Document
public class Deal {
@Id
private ObjectId _id;
private Location location;
private User user;
private String description;
private String title;
private String price;
private boolean approved;
private Date expirationDate;
private Date publishedDate;
}
@Document
public class Location {
@Id
private ObjectId _id;
private Double latitude;
private Double longitude;
private String country;
private String street;
private String zip;
}
@Document
public class User {
@Id
private ObjectId _id;
private String email;
private String password;
private String profile_image_url;
private Collection<Deal> deals = new ArrayList<Deal>();
}
Con questi domini posso con successo CRUD. C'è solo un problema. Quando si salva un utente con offerte, le offerte e la posizione ottengono _id impostato su null quando li si salva in MongoDB. Perché MongoDB non può generare ID univoci per gli oggetti incorporati?
Il risultato dopo il salvataggio di un utente con un affare:
{ "_id" : ObjectId("4fed0591d17011868cf9c982"),
"_class" : "User",
"email" : "[email protected]",
"password" : "mimi",
"deals" : [
{ "_id" : null,
"location" : { "_id" : null,
"latitude" : 2.22,
"longitude" : 3.23445,
"country" : "Denmark",
"street" : "Denmark road 77",
"zip" : "2933" },
"description" : "The new Nexus 7 Tablet. A 7 inch tablet from Google.",
"title" : "Nexus 7",
"price" : "1300",
"approved" : false,
"expirationDate" : Date(1343512800000),
"publishedDate" : Date(1340933521374) } ] }
Come si può vedere dal risultato, affare e posizione ID è impostato su NULL.
Un ID identifica un documento radice, non sub-documenti. Non vi è alcun motivo per cui si desideri generare automaticamente un ID per un documento nidificato in quanto MongoDB può comunque recuperare solo i documenti di livello superiore. Per cosa hai effettivamente bisogno dell'id nidificato? –
Devo cercare solo offerte e non utenti. Ora devo cercare da utente e quindi il ciclo ha gettato ogni affare dell'utente a livello di programmazione. – Millad
L'ID non ha nulla a che fare con ciò che è possibile cercare. È perfettamente alla ricerca di '{'deals.price': {$ gt: 1000}}'. Tuttavia, questa query restituirebbe un oggetto 'Utente' che dovresti manualmente estrarre il' Deal' da quel momento. Questa è una limitazione di MongoDB, nulla implicito da Spring Data. –