可供收集的多个索引-只有一部作品

时间:2019-03-22 12:42:00

标签: c# firebase firebase-realtime-database

首先,我是Firebase数据库的新手,来自SQL背景。

我正在尝试查询一个查询,以返回指定postID的所有通知,无论该通知是针对哪个用户的。

基本上,如果有人删除了他们的帖子,我想删除发送给所有关注者的所有“新帖子”通知。

我的数据结构 enter image description here

我已经尝试过这些索引。

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null",
    "notification": {
      "$user_id": {
            ".indexOn": ["timestamp", "objectId"]
      }
    }
  }
}

我可以使用以下代码通过timestamp进行查询,并且效果很好。

 dbRef.GetChild("notificaton").GetChild(userID).GetQueryOrderedByChild("timestamp");

但是,我不想在查询中使用userID来发布通知。我已经搜索并尝试了一些其他配置来获取索引,但是我在firebase db admin中仅收到错误消息,指出索引存在问题。

我相信这是因为我确实需要按timestamp进行查询,因此该索引需要保留。因此,对于同一集合,我需要两个索引,但由于user_id索引不需要postID,因此配置不同。

我不确定无论如何objectId,都需要如何配置索引才能在user_id上进行查询。

我也尝试过类似的方法。

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null",
    "notification": {
        ".indexOn": ["objectId"]
    },
    "notification": {
      "$user_id": {
        ".indexOn": ["timestamp"]
      }
    }
  }
}

但是我收到错误消息Error saving rules: 'notification' occurs multiple times.

我已经尝试过了。

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null",
    "notification": {
      "$user_id": {
        ".indexOn": ["timestamp"]
      },
      ".indexOn": ["objectId"]
    }
  }
}

Firebase似乎还可以,因为它不会给出错误,但是也不会返回任何数据,我认为这是因为objectId不在根notification集合上

所以我被困住了。

1 个答案:

答案 0 :(得分:2)

如果要将索引添加到每个子节点timestampobjectId的每个用户中,可以使用以下方法:

{
  "rules": {
    "notification": {
      "$user_id": {
        ".indexOn": ["objectId", "timestamp"]
      }
    }
  }
}

这允许您向用户查询具有匹配的objectId的子节点,或者根据时间戳查询用户的子节点。


Firebase查询始终返回运行它们的位置的直接子节点。这意味着查询的orderByChild()子句必须指向每个直接子节点的单个属性的固定路径。换句话说:您无法查询树。

在您的情况下,这意味着您无法通过单个查询搜索所有用户的通知。如果要允许该查询,则需要存储所有用户的通知列表。