1

Предположим следующее.Firebase: как читать каждый дочерний узел в родительском объекте, за исключением детей с конкретными данными

posts : { 
     "$postid":{ 
       "meta":{ 
         "state":true, 
         "text" :"I should be read", 
       }, 
       "likes":{ 
         "uid1":true, 
         "uid2":true, 
       }, 
     }, 
     "$postid":{ 
       "meta":{ 
         "state":false, 
         "text" :"I should be read", 
       }, 
       "likes":{ 
         "uid1":true, 
         "uid2":true, 
         "uid3":true, 
       }, 
     } 
} 

Я хочу запросить родительский узел ('posts') следующим образом.

  • Оставьте из сообщения с состоянием = False
  • Приоритетность сообщения с большинством любит

Правила безопасности

  • Запретить сообщения с состоянием == ложным для чтения.

Вот версия Javascript Как я запрашиваю данные. ////$.fdr === firebase.database.ref();

$.fdr("posts").orderByChild("time").limitToLast(20).once('value',function(r) { 
    var r = r.val(); 
    if(r !== null){     
     ///use r; 
    } 
},function(e){ 
     console.log(e); 
}); 

Почему это: я хочу, чтобы пользователь удалял сообщение и удалял его позже. Чтобы удалить, меняем значение «post.meta.state» на «false». Пока значение "post.meta.state" неверно, правила безопасности не должны позволять читать эту запись.

Проблема: Если я установить правила в почтовом узле, а не родительский узел («сообщения»),

"postid": { 
      ".read":"data.child('state').val() == true" 
      } 

, то я могу ограничить «.read», но только если я буду запрашивать сообщения следующим образом:

firebase.database.ref("posts/postid"); 

в противном случае при попытке запроса от родительского узла, как:

firebase.database.ref("posts/"), 

, чтобы я мог отфильтровать сообщения, которые я не хочу возвращать, тогда мне придется поднять правила с «сообщений» детей до «posts» (parent), что приведет к игнорированию правил в дочерних элементах, и там я не могу найти способ отказать в возвращении сообщений с «state» == false;

Вышеуказанное основано на моем понимании до сих пор, пожалуйста, исправьте, где я потерялся.

+0

Вы undoubtably уже пытались что-то. Поделитесь тем, что вы пробовали, и минимальным кодом, который показывает, где вы застряли. По крайней мере, это скажет нам, на какой платформе вы нацеливаетесь. Но, скорее всего, это также даст нам гораздо лучшее представление о том, как вам помочь. –

+0

@FrankvanPuffelen см. Новое редактирование. – Relm

ответ

2

К сожалению, невозможно заблокировать чтение/запись на любом дочернем узле, когда пользователь в качестве разрешения на чтение/запись родительского узла. Вы можете узнать больше о том, как правила безопасности каскадируются в Firebase Docs.

Тем не менее, есть несколько возможных решений для Вас, чтобы рассмотреть следующие вопросы:

  1. Вместо маркировки пост удален, вы можете переместить его в отдельный родительский узел. Затем вы можете настроить правила безопасности для deleted_posts, чтобы скрыть это.

    { 
        "posts": { 
        "$postid1": { 
         "meta": { 
         "state": true, 
         "text": "I should be readable" 
         }, 
         "likes": { 
         "uid1": true, 
         "uid2": true, 
         "uid3": true 
         } 
        } 
        } 
        "deleted_posts": { 
        "$postid2": { 
         "meta": { 
         "state": false, 
         "text": "I should not be readable" 
         }, 
         "likes": { 
         } 
        } 
        } 
    } 
    
  2. Держите отдельный список postids, которые видны, и установить «сообщения» узел не читаемые, но дети до читаемого, если не скрыт. Вам придется сделать второй запрос, чтобы получить данные для каждого поста:

    { 
        "posts": { 
        "$postid1": { 
         "meta": { 
         "state": true, 
         "text": "I should be readable" 
         }, 
         "likes": { 
         "uid1": true, 
         "uid2": true, 
         "uid3": true 
         } 
        }, 
        "$postid2": { 
         "meta": { 
         "state": false, 
         "text": "I should not be readable" 
         }, 
         "likes": {} 
        }, 
        "$postid3": { 
         "meta": { 
         "state": true, 
         "text": "I should be readable" 
         }, 
         "likes": {} 
        } 
        }, 
        "visible_posts": { 
        "$postid1": true, 
        "$postid3": true 
        } 
    } 
    
Смежные вопросы