【问题标题】:Firestore SetOptions.mergeFields doesn't workFirestore SetOptions.mergeFields 不起作用
【发布时间】:2018-05-24 14:23:54
【问题描述】:

我正在尝试在我的文档上使用 .set 在其中设置 2 个值,但它给了我这个错误

Field 'friendRequests' is specified in your field mask but not in your input data.

错误是由我的代码中的这一行触发的:

mCollRef.document(documentID).set(tempUser, SetOptions.mergeFields(fieldsToUpdate))

我不使用时一切正常SetOptions,只是mCollRef.document(documentID).set(tempUser)

我在这里做错了什么?

我的代码在这里:

mCollRef.whereEqualTo("userID", clickedUserID)
  .get()
  .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
     @Override
     public void onComplete(@NonNull Task<QuerySnapshot> task) {

     if(task.isSuccessful()) {

       List<String> fieldsToUpdate = Arrays.asList("friendRequests", "friends");

       for(QueryDocumentSnapshot document : task.getResult()) {

         User tempUser = document.toObject(User.class);

         tempUser.updateFriends(mUsersName, mUsersID, 1);
         tempUser.updateFriendRequests(myNoDotEmail, 2);
         String friendName = tempUser.getUserName();
         String documentID = document.getId();

         mCollRef.document(documentID).set(tempUser, SetOptions.mergeFields(fieldsToUpdate))
           .addOnSuccessListener(new OnSuccessListener<Void>() {
              @Override
              public void onSuccess(Void aVoid) {

                Toast.makeText(FriendsActivity.this, "Friend Added", Toast.LENGTH_SHORT).show();

              }).addOnFailureListener(new OnFailureListener() {
               @Override
               public void onFailure(@NonNull Exception e) {

                  Toast.makeText(FriendsActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
 });

值得指出的是,有时它会起作用,比如 1/10 会无缘无故地起作用,而其他 9 次则不起作用

【问题讨论】:

  • 显然,键/值对中缺少字段friendRequests?
  • 您的字段不存在。你确定你有正确的代码吗?
  • 哦,对...我的意思是,字段没有丢失,但是在我在代码中执行的操作之后它是空的。我将在下面发布整个答案,谢谢大家

标签: java android firebase google-cloud-firestore


【解决方案1】:

所以,原来错误是由我的代码在SetOptions 调用上方几行引起的:

正如您在上面看到的,字段friendRequests 不为空,但我使用问题tempUser.updateFriendRequests(myNoDotEmail, 2); 中的此代码将其设置为空,并且当它显示错误时。当有 2 个或更多 friendRequests 并且我删除其中一个时,一切正常,而不是将字段完全留空。

原来SetOptions.mergeFields 不能被调用来将文档内的嵌套地图设置为空地图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2020-04-04
    • 2018-12-28
    相关资源
    最近更新 更多