为简单起见,假设我有一个具有以下结构的数据库:
project
└── users
├── safuhf8sdf76fs
│ ├── name: 'William'
│ └── age: 19
├── sffuef5srf72fd
│ ├── name: 'Emily'
│ └── age: 20
└── rfdu4ffsgf42gi
├── name: 'Sam'
└── age: 24
我们还要说,我正在尝试在Firebase云功能中检索年龄小于或等于22的用户。此函数可以在任意时间触发,并且应该查询具有匹配年龄条件的用户,如上所述。
我以为我可以这样做:
admin.database().ref('users').orderByChild('age').endAt(22).once('child_added', function (snapshot) {
// perform logic with each user snapshot
});
但这只会在每次调用时返回一个用户 - 尽管它确实提供了orderByChild
指定的最年轻用户。在这个例子中,它只返回用户William,而不是Emily。但是如果我从数据库中删除William,那么下次它会返回Emily,所以我知道Emily也符合标准。
The Retrieving Data docs建议这应该按照我的意愿对每个孩子运行一次,但这不会发生,我不知道为什么。也许它与使用.once
而不是.on
有关,但我不想保留引用。我希望它执行逻辑,然后立即删除引用。
有什么想法吗?感谢。
答案 0 :(得分:2)
使用.once()
会在您第一次添加孩子时触发回调,这应该是William。相反,如果您使用.on()
,则每次添加符合条件的子项时,它都会触发回调,即一次用于William,另一次用于Emily。
此外,您应该检查将触发回调的事件。您希望在第一次添加子项时发生这种情况,您希望每次添加新子项时都发生这种情况,您希望它在您调用函数时发生,或者每次添加更改值时都会发生。
答案 1 :(得分:1)
你可以使用:
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()
将包含所有被查询子项的对象