从集合中获取第一个元素并将其删除

时间:2019-02-13 09:22:52

标签: javascript firebase google-cloud-firestore google-cloud-functions

我需要从Firebase集合中获取第一个元素,然后将其删除,但无法弄清楚该如何做。我需要它来实现云功能。

class Student(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)

2 个答案:

答案 0 :(得分:2)

Bohkoval的总体逻辑(正确答案是正确的),但是答案与实时数据库有关,而OP正在与 Firestore 合作(来自他的问题中使用的标签)。

假设您“具有[您可以排序的时间戳记属性”,如您在下面的评论中所述,在Cloud Function中,您将对Firestore进行以下操作:

return admin.firestore().collection("yourCollection")
.orderBy("yourTimestamp", "desc")
.limit(1)
.get()
.then(querySnapshot => {
    if (!querySnapshot.empty) {
        //We know there is one doc in the querySnapshot
        const queryDocumentSnapshot = querySnapshot.docs[0];
        return queryDocumentSnapshot.ref.delete();
    } else {
        console.log("No document corresponding to the query!");
        return null;
    }
});

答案 1 :(得分:1)

您需要在所需元素上调用delete()方法。

Firebase集合不是有序数据类型,因此不存在“第一个元素”这样的概念。但是您可以add()使用一些标志(例如,时间戳记)以区分首先添加了哪个元素。 Firebase集合本身没有任何内置标志来将元素检测为“第一”。

例如,如果您有时间戳标记:

var collection = firebase.database().ref('/path/to/collection');
var collectionLast = collection.orderByChild('timestamp').limit(1);
var listener = collectionLast.on('child_added', function(snapshot) {
    snapshot.ref.remove();
});
  1. 获取收藏夹参考书
  2. 按时间戳排序元素(将按升序排列),限制为第一个元素
  3. 从集合中检索到此元素时,将使用快照有效负载触发child_added事件并将其删除。

此外,如果需要使用它来实现云功能,请注意value事件。您需要将第3步更改为以下代码;

collectionLast.once('value', function(snapshot) {
    var updates = {};
    snapshot.forEach(function(child) {
      updates[child.key] = null
    });
    return ref.update(updates);
  });

有关更多信息,您可以获取文档:https://firebase.google.com/docs/database/admin/retrieve-data