一旦child_add,Firebase orderByChild只提供一个子级



为了简单起见,假设我有一个具有以下结构的数据库:

project
└── users
├── safuhf8sdf76fs
│   ├── name: 'William'
│   └── age: 19
├── sffuef5srf72fd
│   ├── name: 'Emily'
│   └── age: 20
└── rfdu4ffsgf42gi
├── name: 'Sam'
└── age: 24

还可以说,我正在尝试在Firebase Cloud函数中检索年龄小于或等于22岁的用户。该函数可以在任意时间触发,并且应该查询具有上述匹配年龄条件的用户。

我想我可以做到:

admin.database().ref('users').orderByChild('age').endAt(22).once('child_added', function (snapshot) {
// perform logic with each user snapshot
});

但每次调用它时,它只返回一个用户——尽管它确实提供了orderByChild指定的最年轻的用户。在本例中,它只返回用户William,而不返回Emily。但如果我把威廉从数据库中删除,那么下次就会返回艾米莉,所以我知道艾米莉也符合标准。

检索数据文档建议,根据我的意愿,应该为每个孩子运行一次,但这并没有发生,我不知道为什么。也许这与使用.once而不是.on有关,但我不希望保留引用。我希望它执行逻辑,然后立即删除引用。

有什么想法吗?谢谢

使用.once()将在第一次添加子项时触发回调,该子项应该是William。相反,如果您使用.on(),它将在每次添加符合条件的孩子时触发回调,即一次为William,另一次为Emily。

此外,您还应该检查将触发回调的事件。您希望这种情况在第一次添加子项时发生,希望每次添加新子项时都发生,希望在调用函数时发生,或每次添加更改值时都发生。

您可以使用:

admin.database().ref('users').orderByChild('age').endAt(22)
.once('value', function (snapshot) {...})

或:

admin.database().ref('users').orderByChild('age').endAt(22)
.once('value').then((snapshot)=> {...})

snapshot.val()将包含一个对象和所有查询的子

相关内容

  • 没有找到相关文章

最新更新