如何使用文档引用在 Firestore 的文档中添加字段防止覆盖?

问题描述

首先,我希望任何人都可以使用下面的文档参考来帮助调整我的代码行。

从下面的 firebase 控制台可以看出,我的 FaceEmotion-id 文档有 Faceemotion 和 Timestamp 字段。 使用我下面的代码,每次用户得到不同的情绪时,firestore 都会覆盖这些情绪。因此,我无法看到用户在使用我的应用程序时以及他/她使用我的应用程序的时间不同时得到的不同情绪。

我需要防止覆盖上面提到的两个字段。请帮我。我想要的是在文档中添加字段而不是覆盖它。

enter image description here

另外,我不知道如何为名为 FaceEmotion-id 的文档生成不同的 id。我实际上已经使用 Uid 事先引用了该文档,您可以从下面的代码中看到。但是对于“结果”集合中的子文档。我似乎找不到让它独一无二的方法

这是我的代码

public static final String TAG = "TAG";
FirebaseAuth fAuth;
FirebaseFirestore fStore;
String userID;
String FaceEmotion;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detection);
  
    fAuth = FirebaseAuth.getInstance();
    fStore = FirebaseFirestore.getInstance();

    StartQues = (Button) findViewById(R.id.view_question);
    StartQues.setonClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            String Emotion = EmotionType.toString();

            userID = fAuth.getCurrentUser().getUid();
            FaceEmotion = "FaceEmotion";
            DocumentReference documentReference = fStore.collection("users").document(userID).collection("Result").document("FaceEmotion-id");
            //DocumentReference documentReference = fStore.collection("users").document(userID).collection("FaceEmotion").document(Emotion);
            Map<String,Object> user = new HashMap<>();
            user.put("FaceEmotion",Emotion);
            user.put("timestamp",FieldValue.serverTimestamp());

            documentReference.set(user).addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    Log.d(TAG,"onSuccess: Data has been saved "+ userID);
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.d(TAG,"onFailure: " + e.toString());
                }
            });

解决方法

听起来您想要存储时间戳和表情符号列表。如果您想将它们存储在单个文档中,逻辑数据结构将是将它们存储在一个数组/集合中,如下所示:

user.put("FaceEmotion",Emotion);
user.put("timestamp",FieldValue.serverTimestamp());

documentReference.update("emotions",FieldValue.arrayUnion(user))

这段代码每次运行时,都会向文档中的 emotions 数组添加一个新项目。

另请参阅 updating elements in an array 上的 Firebase 文档。