【问题标题】:Firebase orderByChild once child_added is only giving one childFirebase orderByChild 一旦 child_added 只给一个孩子
【发布时间】: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


【解决方案1】:

使用.once() 将在您第一次添加一个孩子(应该是威廉)时触发回调。相反,如果您使用.on(),它将在每次添加符合条件的孩子时触发回调,即一次用于威廉,另一次用于艾米丽。

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

【讨论】:

  • 逻辑完成后立即删除引用的最佳方法是什么?这是在云函数中,所以我需要删除引用。
  • 这个函数不是由数据库事件触发的,而是一个HTTP触发器。我需要查询一次适用的用户,然后删除所有引用,直到下一个 HTTP 触发器。
  • 如果您使用.once(),则无需删除引用。它只会在您调用函数时发生,仅此而已。
  • 但是.once只给了第一个孩子,而且我需要所有适用的孩子,所以我想我必须使用.on
  • 不,.once('value') 会给您所有符合条件的孩子,只需 一次。相反,如果您使用 .on('value'),它会在每次更改参考值(即 users)时为您提供所有符合条件的子代。
【解决方案2】:

你可以使用:

 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() 将包含一个 object 与所有查询的孩子

【讨论】:

    猜你喜欢
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    相关资源
    最近更新 更多