我正在尝试构建一个 Vue.js 应用程序,该应用程序可以将项目动态推送到 Cloud Firestore 中的数组中。这些项位于events
数组中,包含各种对象,其中一个是时间戳。请参阅下面的功能:
let newDetails = this.newDetails
let newImage = this.imageUrl
let timestamp = moment(Date.now()).format('lll')
let ref = db.collection('users').where('user_id', '==', firebase.auth().currentUser.uid)
.get()
.then(function (querySnapshot) {
querySnapshot.forEach(function (doc) {
console.log(doc.id, ' => ', doc.data())
doc.ref.update({
'events': firebase.firestore.FieldValue.arrayUnion({
'name': doc.data().name,
'details': newDetails,
'image': newImage,
'timestamp': moment(Date.now()).format('lll')
})
})
})
})
我的目标是根据时间戳的顺序将每个数组项呈现到 DOM。我最初尝试设置以下 Vuex 操作(再次见下文(来使用.orderBy()
函数来实现此目标:
setCurrentUser: async context => {
let ref = db.collection('users').orderBy('events')
let snapshot = await ref.where('user_id', '==', firebase.auth().currentUser.uid).get()
const users = []
snapshot.forEach(doc => {
let currentUserData = doc.data()
currentUserData.id = doc.id
users.push(currentUserData)
})
context.commit('setCurrentUser', users)
},
但是,我知道可能无法根据数组类型文档项目中的时间戳对这些项目进行排序。关于如何在不将时间戳分配为数组对象的情况下为 Firestore 中的每个数组项分配时间戳,以便仍然可以根据时间戳排列数组类型文档项的任何建议?
以下是 Cloud Firestore 的可用数据类型: https://firebase.google.com/docs/firestore/manage-data/data-types
我建议使用Map
来解决根据时间戳对事件进行排序的问题。
选项 1:Map<Timestamp, Event>
如果同一时间不能有事件,则键可以是时间戳。 将密钥设置为Timestamp
的原因是Map
按Key
排序,然后按 Cloud Firestore 的Value
排序。
选项 2:如果一个用户可以同时有多个事件,则可以Event
密钥。因此,地图看起来像这样Map<Event,Timestamp>
,您可以在从Firestore检索Map
后根据值进行排序。
选项 3:如果可以将所有事件存储在另一个集合Events
中,则事件的documentId
可以是键。所以Map
会Map<String,Timestamp>
.如果用户可以有很多事件,我会建议使用此选项。
希望这有帮助。