Firebase数据库删除所有节点等于特定值

Joi*_*ois 1 javascript firebase react-native firebase-realtime-database

我有一个用户列表,其中包含一个名为的节点scannedCards,其中包含一个数组cardIds.以下是一个用户的屏幕截图.

以下是一个用户的屏幕截图

有多个像上面这样的用户,我想删除所有的卡ID,如果它们是equalTo(Some Card Id),我想同时与所有用户一起.

以下是我使用的查询:

  const ref = database.ref('users');
  const query = ref.orderByChild('cardId').equalTo(cardId);
Run Code Online (Sandbox Code Playgroud)

但结果总是空的,有人可以告诉我如何实现这一目标吗?

Pat*_*ham 5

您上面列出的查询似乎没有返回任何内容,因为根据提供的屏幕截图,cardId它不是用户的直接子属性,而是scannedCards用户可能拥有的列表下每个对象的属性.

如果您只需要在一次性操作中执行此操作,则可以运行以下操作:

const ref = database.ref('users');
ref.once('value').then(snapshot => {
  const users = snapshot.val();
  for (var user_id in users) {
    const scannedCards = users[user_id].scannedCards;
    for (var card in scannedCards) {
      if (scannedCards[card].card_id == "<some card id>") {
        firebase.database().ref(`users/${user_id}/scannedCards/${card_id}`)
        .set(null);
      }
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

如果您打算让登录用户删除他们扫描的卡片,那么它会有点复杂:

// user_id is for whoever is logged in
const ref = firebase.database().ref(`users/${user_id}/scannedCards`);
ref.once('value').then(snapshot => {
  const scannedCards = snapshot.val();
  for (var card in scannedCards) {
    if (scannedCards[card].card_id == "<some card id>") {
      firebase.database().ref(`users/${user_id}/scannedCards/${card_id}`)
      .set(null)
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

另外值得指出的是,scannedCards不是一个卡ID数组,因为键是对象ID,值是对象(包含cardId和userId属性).