Firestore – Adding Server Timestamp field to the Object which being added

Firestore – Adding Server Timestamp field to the Object which being added

I have a Challenge object, which has it's own properties and I'm able to add it to the database successfully like this:
DocumentReference challengeRef=usersRef.document(loggedUserEmail).collection("challenges_feed").
                document(callengeID);
challengeRef.set(currentChallenge);

This is how it looks like in the database:

I'd like to make a new field in the database (under this challenge) which called latestUpdateTimetamp. This is how it should look like (I have added it manually):

I have tried to set it in the constructor of the object like this:
private Map latestUpdateTimestamp;

public Challenge(String id, String senderName,  String senderEmail) {   
            this.senderName=senderName;
            this.senderEmail = senderEmail;

            this.latestUpdateTimestamp= ServerValue.TIMESTAMP;
        }

But this is what I get in the database:

I'm trying to add the latestUpdateTimestamp to the Challenge and the Challenge object itself to the database at the same call. Is it possible? 
Can I somehow add this timestamp as a property to this object before adding it? 
I know I'm able to make a new call and add this field, but I'm wondering if it's possible at once.

Solutions/Answers:

Solution 1:

Yes you can, using a Map. First of all, according to official docs it will be necessary to use an annotation that looks like this:

@ServerTimestamp Date time;

Annotation used to mark a Date field to be populated with a server timestamp. If a POJO being written contains null for a @ServerTimestamp-annotated field, it will be replaced with a server-generated timestamp.

This is how you can update the latestUpdateTimestamp field with the server timestamp and the challangeId with the desired value at the same time.

DocumentReference senderRef = challengeRef
    .document(loggedUserEmail)
    .collection("challenges_feed")
    .document(callengeID);

Map<String, Object> updates = new HashMap<>();
updates.put("latestUpdateTimestamp", FieldValue.serverTimestamp());
updates.put("challangeId", "newChallangeId");
senderRef.update(updates).addOnCompleteListener(new OnCompleteListener<Void>() {/* ... */}

Solution 2:

As per Google Documentation You can use FieldValue.serverTimestamp(). Something like this

Java

DocumentReference docRef = db.collection("objects").document("some-id");
Map<String,Object> post = new HashMap<>();
post.put("timestamp", FieldValue.serverTimestamp());

docRef.add(updates).addOnCompleteListener(new OnCompleteListener<Void>() {
 .....
}

Kotlin

val docRef = db.collection("objects").document("some-id")
val updates = HashMap<String, Any>()
updates["timestamp"] = FieldValue.serverTimestamp()

docRef.add(updates).addOnCompleteListener { }

References

Related:  “Hostname match not found” error in firebase phone authentication(with ionic)