I have a question regarding MongoDB with Spring Data. I have these domain classes:
@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>();
}
With these domains I can successfully CRUD. There is only one problem. When saving a User with Deals, the deals and Location get _id set to null when saving them to MongoDB. Why can´t MongoDB generate unique id´s for embedded objects?
The result after saving a User with one deal:
{ "_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 ) } ] }
As you can see from the result, Deal and Location ID is set to NULL.
MongoDB fetch documents containing 'null' If we want to fetch documents from the collection "testtable" which contains the value of "interest" is null, the following mongodb command can be used : >db. testtable. find( { "interest" : null } ).
All documents in MongoDB must have a populated _id field. If a document hasn't been assigned an _id value, MongoDB will automatically generate one.
MongoDB provides you a cool feature which is known as Embedded or Nested Document. Embedded document or nested documents are those types of documents which contain a document inside another document.
Basically “not null” constraint is used to display the document without null from the collection as per our requirement means as per our requirement we can choose any field name with a different comparison operator and Boolean operator. Basically, we can use the $exists a method to implement the not null in MongoDB.
MongoDB CRUD operations (insert
, update
, find
, remove
) all operate on top-level documents exclusively -- although of course you can filter by fields in embedded documents. Embedded documents are always returned within the parent document.
The _id
field is a required field of the parent document, and is typically not necessary or present in embedded documents. If you require a unique identifier, you can certainly create them, and you may use the _id
field to store them if that is convenient for your code or your mental model; more typically, they are named after what they represent (e.g. "username", "otherSystemKey", etc). Neither MongoDB itself, nor any of the drivers will automatically populate an _id
field except on the top-level document.
Specifically in Java, if you wish to generate ObjectId values for the _id
field in embedded documents, you can do so with:
someEmbeddedDoc._id = new ObjectId();
In the context of a REST architecture it makes all the sense that nested docs have their own Ids.
Having argued my point about the need of ids in nested docs @dcrosta has already given a correct answer on how to populate the _id field in mongo.
Hope this helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With