Firestore SetOptions.mergeFields不起作用

时间:2018-05-24 14:23:55

标签: java android firebase google-cloud-firestore

我尝试在我的文档中使用.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次它只是没有

1 个答案:

答案 0 :(得分:0)

所以,事实证明错误是由我的代码SetOptions调用上面几行引起的:

http://rextester.com/l/nodejs_online_compiler

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

原来不能调用SetOptions.mergeFields来将文档中的嵌套映射设置为空映射。