web-dev-qa-db-fra.com

Firestore - Ajout du champ Horodatage du serveur à l'objet qui est ajouté

J'ai un objet Challenge, qui a ses propres propriétés et je peux l'ajouter à la base de données avec succès comme ceci:

DocumentReference challengeRef=usersRef.document(loggedUserEmail).collection("challenges_feed").
                document(callengeID);
challengeRef.set(currentChallenge);

Voici à quoi cela ressemble dans la base de données:

enter image description here

Je voudrais créer un nouveau champ dans la base de données (sous ce défi) qui s'appelle latestUpdateTimetamp. Voici à quoi cela ressemble devrait (je l'ai ajouté manuellement):

enter image description here

J'ai essayé de le placer dans le constructor du object comme ceci:

private Map<String,String> latestUpdateTimestamp;

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

            this.latestUpdateTimestamp= ServerValue.TIMESTAMP;
        }

Mais c'est ce que j'obtiens dans le database:

enter image description here

J'essaie d'ajouter le latestUpdateTimestamp au Challenge et le Challenge lui-même à la base de données au même appel. Est-ce possible?

Puis-je en quelque sorte ajouter ce timestamp en tant que propriété à ce object avant de l'ajouter?

Je sais que je peux faire un nouvel appel et ajouter ce champ, mais je me demande si c'est possible à la fois.

10
Tal Barda

Oui, vous pouvez utiliser un Map. Tout d'abord, selon documents officiels il sera nécessaire d'utiliser une annotation qui ressemble à ceci:

@ServerTimestamp Date time;

Annotation utilisée pour marquer un champ Date à remplir avec un horodatage du serveur. Si un POJO en cours d'écriture contient null pour un champ annoté @ ServerTimestamp, il sera remplacé par un horodatage généré par le serveur.

Voici comment mettre à jour le champ latestUpdateTimestamp avec l'horodatage du serveur et le challangeId avec la valeur souhaitée en même temps.

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>() {/* ... */}
34
Alex Mamo

Selon la documentation Google, vous pouvez utiliser FieldValue.serverTimestamp (). Quelque chose comme ça

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 { }
1
Masum