为了简单起见,假设我有一个具有以下结构的数据库:
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()
将包含一个对象和所有查询的子