2017-10-21 6 views
0

그래서 실시간 DB에서 팬 아웃 쓰기를 할 때 보안 규칙에 newData().parent().parent()...parent()을 통해 다양한 경로로 기록 될 새 데이터를 확인할 수있었습니다.보안 규칙에 대한 다른 컬렉션의 새 문서를 확인하는 방법은 무엇입니까?

const fanout = { 
    'users/user_a': { 
    username: 'foobar' 
    }, 

    'usernames': { 
    'foobar': 'user_a' 
    } 
}; 

firebase.update(fanout); 

그리고이 같은 보안 뭔가 : 경우 FireStore의 보안 규칙에서이 작업을 수행 할 수있는 방법이 있는지

"rules": { 
    "users": { 
    $user_id: { 
     "username": { 
     ".validate": "newData.parent().parent().parent().child('usernames').child(newData.val()).val() == auth.uid; 
     } 
    } 
    }, 

    "usernames": { 
    "$username": { 
     ".validate": "newData.parent().parent().child('users').child(auth.uid).child('username').val() == $username" 
    } 
    } 
} 

만약 궁금? 나는 exists() 기능을 보았지만 기존 문서에 대해서만 쓰여지려고하지는 않습니다.

답변

0

현재 불행히도 Cloud Firestore Rules에는 동일한 기능이 없습니다. request.resource.data을 사용하여 요청에 기록 된 데이터를 검사 할 수 있지만 배치 쓰기는 규칙에서 별도의 요청으로 처리되며 실시간 데이터베이스에서 수행 한 newData과 같은 모든 기록의 순 효과를 검사 할 방법이 없습니다. 우리는 앞으로 Cloud Firestore에 이것을 추가하려고합니다.

usersRef.where('username', '==' 'foobar').get() 검색어를 사용하여 특정 사용자 이름을 얻을 수 있으므로이 특정 사례는 팬 아웃없이 해결 될 수 있습니다.

+0

사용자 및 사용자 이름을 저장하기 위해 별도의 2 건의 트랜잭션을 수행하면 데이터 품질 문제가 발생할 수 있습니다 (예 : 사용자가 갑자기 인터넷을 잃거나 앱을 닫을 때 두 번째 트랜잭션이 저장되지 않는 경우). 정확히 같은 이유로 내 글의 90 %가 일괄 처리됩니다. 이 문제를 해결하기 위해 필자는 이상적인 클라우드 기능을 사용하고 있습니다. 곧 Cloud Firestore의 기능 토지가되기를 바랍니다! 감사! – rmmmp

+0

죄송합니다. 정말 설명이 잘못되었습니다. 나는 "usernames"콜렉션을 없애고 "users"를 직접 쿼리함으로써 팬 아웃을 피할 수 있었고 따라서 두 곳으로 쓰고 2 개의 트랜잭션을 사용할 필요가 없다고 말하고자했다. –

+0

하지만 사용자마다 고유 한 사용자 이름을 사용하려면 어떻게해야합니까? 나는 우리가 사용자 이름을 바꿀 수 있기를 원하기 때문에 그것을 열쇠로 만들 계획이 없다. – rmmmp