从Firebase集合查询数据

时间:2018-12-07 20:19:00

标签: javascript firebase vuejs2 google-cloud-firestore

我已经在LAMP堆栈中工作了多年,并且一直在努力解决Firebase和NoSQL数据库的高级查询问题。我想从集合中返回5个随机文档。下面是到目前为止编写的VueJS代码:

这是我创建的数据对象:

data () {
    return {
        courseIds: [],
    }
}

这是我创建的生命周期挂钩,用于查询Firebase NoSQL数据库:

created() {
    // fetch data from firestore
    database.collection('courses').get()
        .then(snapshot => {
            snapshot.forEach(doc => {
                let course = doc.data()
                course.id  = doc.id

                this.courseIds.push(course.id)
            })
        })          
}

因为我想对返回的数据进行随机化,所以我添加了beforeMount生命周期挂钩,该挂钩调用了Fisher-Yates随机播放方法。计划是重新整理返回的数据,然后仅返回前5个文档:

beforeMount() {
    this.courseIds = this.shuffle(this.courseIds)
}

方法:

methods: {
    shuffle: function(array) {
        var m = array.length, t, i;

        while (m) {
            i = Math.floor(Math.random() * m--);

            t = array[m];
            array[m] = array[i];
            array[i] = t;
        }

        return array;
    }
}

我是一个学习缓慢的人,所以这很可能是解决问题的一种麻木的方法。我当前的问题是Firebase将Ids作为对象而不是数组返回,因此我的shuffle方法无法按预期工作。请参见下面的console.log()

[__ob__: Observer]
0: "0HnqJ8zZg1Rs3D4qod4l"
1: "1gZmoUpCOSDeLsYMDi4v"
2: "JrJj3a84qKTD72ncvGXd"
3: "LWMbY98m3sKLrHNDSUkW"
4: "SUn1kxHzMo7fu5urpNB5"
5: "kQRWQIj0mFXIWVJcaouY"
length: 6
__ob__: Observer {value: Array(6), dep: Dep, vmCount: 0}
__proto__: Array

有人有更好的方法来使用此功能,还是将courseIds转换为要改组的数组的好方法?

1 个答案:

答案 0 :(得分:1)

如果您做一些不同的操作会发生什么,如下所示:

created() {
    // fetch data from firestore
    database.collection('courses').get()
        .then(snapshot => {
            let courseIdsArray = [];
            snapshot.forEach(doc => {
                courseIdsArray.push(doc.id);
            });    
            this.courseIds = courseIdsArray;
        });          
    }