【发布时间】:2018-03-19 10:57:49
【问题描述】:
为简单起见,假设我有一个具有以下结构的数据库:
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 有关,但我不希望保留参考。我希望它执行逻辑,然后立即删除引用。
有什么想法吗?谢谢。
【问题讨论】:
-
.once('value')呢? -
使用
value代替child_added返回整个users树(包含符合条件的子级)而不是子级本身。从技术上讲,我可以让它以这种方式工作,但在我的情况下,这非常违反直觉。 -
.once('child_added')不起作用,它只会给你第一个孩子。.on('child_added')也不起作用,因为您不知道什么时候拥有所有孩子。您需要使用.once('value')。如果您不确定如何使用您正在执行的逻辑使其工作,我们将需要查看该代码。 -
好吧,我猜我只需要遍历
snapshot中的每个对象,因为使用value会将它们全部放入一棵大树中(本例中有两个对象) -
没错。当然不要忘记使用
snapshot.val()。
标签: javascript firebase firebase-realtime-database google-cloud-functions