Firebase orderByChild一旦child_added只给一个孩子

时间:2017-10-07 23:15:17

标签: javascript firebase firebase-realtime-database google-cloud-functions

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

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有关,但我不想保留引用。我希望它执行逻辑,然后立即删除引用。

有什么想法吗?感谢。

2 个答案:

答案 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()将包含所有被查询子项的对象