如何在Firestore文档中自动生成值?

时间:2019-09-04 18:30:46

标签: firebase google-cloud-firestore

我的文档需要一个整数值,该整数值用作查询的索引。每个文档都包含一个索引字段(数字),在这里我要逐个手动分配值。也许我可以在某个地方放一些东西来存储当前索引值,然后递增它,并在创建新文档时将其作为索引值分配给新文档。

2 个答案:

答案 0 :(得分:0)

Cloud Firestore中没有此类功能。您将需要自己提出所有价值观。 Firestore可以自动为您生成的唯一内容是基于服务器时间感的时间戳。

答案 1 :(得分:0)

我可以想到两种方法来处理此问题,尽管我不知道您想对文档ID使用基于整数的索引。如果删除一个,则索引现在关闭。那写失败呢?比赛条件?等等。您可能需要重新考虑您的数据结构和组织。

如果不需要使用整数作为文档ID:

// Create a reference to a new document inside your collection
const ref = firebase.firestore().collection('myCollectionName').doc()

// Now you have an auto-generated document id you can use for your code
const myData = {...}

const setDoc = await firebase.firestore().collection('myCollectionName').doc(ref.id).set(myData)

如果使用整数 是必需的:

您需要一个单独的集合/对象来跟踪最新索引,以免发生冲突。然后,您需要增加该值以获得下一个索引,然后将其用作您的ID。这会带来一些固有的问题,例如...尝试输入数据时如果数据不正确该怎么办,但是在增加值之后...等等。

// Collection: myIndex
// Doc: index
// Value: {lastIndex: 1}
const doc = await firebase.firestore().collection('myIndex').doc('index')

// You now have the last index value using:
const lastIndex = doc.val().lastIndex
const nextIndex = lastIndex + 1
const myData = {...}

// Now run a batched operation to write to both documents
const batch = firebase.firestore().batch()

// Update the index document
const indexUpdateRef = firebase.firestore().collection('myIndex').doc('index')
batch.update(indexUpdateRef, {lastIndex: nextIndex})

// Add your new myData document
const newDataRef = firebase.firestore().collection('myCollectionName').doc(nextIndex)
batch.set(newDataRef, myData)

// Commit the batch
await batch.commit()

正如我所说-我认为这确实是一个错误的主意和工作流程,但这是可行的。保持同步也有很多不足。

无论哪种情况...

您可以利用FieldValue.increment()来帮助自动增加您的整数值,但这将增加更多的读写操作,更长的处理时间以及所有这些费用。这就是为什么我从头开始并坚持认为,如果您想自动增加索引,则应该重新考虑数据结构或考虑使用RDB。