Javascript 在创建保存自己docId的文档时,使用.add()而不是.set()是否有优势?
可以使用Javascript 在创建保存自己docId的文档时,使用.add()而不是.set()是否有优势?,javascript,angular,firebase,google-cloud-firestore,angularfire2,Javascript,Angular,Firebase,Google Cloud Firestore,Angularfire2,可以使用.add()或.set()在Firestore中创建文档。对于这个特殊的问题,让我们假设文档拥有一个具有自己docId的属性 使用.add()和以下.set()更新接近: db.collection("cities").add({ docId: null, name: 'Tokyo', country: 'Japan' }); //... get docId of inserted document via DocumentReference Promi
.add()
或.set()
在Firestore中创建文档。对于这个特殊的问题,让我们假设文档拥有一个具有自己docId的属性
使用.add()
和以下.set()
更新接近:
db.collection("cities").add({
docId: null,
name: 'Tokyo',
country: 'Japan'
});
//... get docId of inserted document via DocumentReference Promise return of add()
//update with docId
db.collection("cities").doc(docId).set(city, {merge: true});
仅使用set()
接近:
当我想存储一个拥有自己docId的文档时,使用.add()
有什么特别的好处吗?另外,总是使用.set()
创建新文档有什么特别的缺点吗
使用第二种方法时,.doc()
是否总是返回唯一且未使用的ID?使用第一种方法总会导致两个写操作,而仅使用。set()
只需要一个
当我想存储一个拥有自己docId的文档时,使用.add()有什么特别的优点吗?另外,总是使用.set()创建新文档有什么特别的缺点吗
我相信您已经用您发布的以下有效评估回答了问题的这一部分:
使用第一种方法总会导致两个写操作,而仅使用.set()只需要一个
这意味着在计费方面,您发出的写操作越多,您的计费就越多,因为您的计费取决于实例的位置,即每100000个文档中的写操作数。现在,从实现角度来看,这些方法本身在幕后并没有什么特别的区别:
在幕后,.add(…)和.doc().set(…)完全等效,因此您可以使用更方便的选项
因此,我相信对于您的特定用例,使用doc()set()
方法可能是最好的方法(以避免由于写入次数增加而增加计费)
使用第二种方法时,.doc()是否总是返回唯一且未使用的ID
使用.doc()必然会创建一个空文档,其中包含一个自动生成的标识符,该标识符是唯一的,正如引用中所建议的那样。这是否回答了您的问题?对不起,我不知道为什么这个问题被标记为重复,只有标题与提供的帖子相同。我知道这两种方法之间的区别,我只是想知道在字段中存储documentId时,什么是最佳方法(或最佳实践)。此外,如果.doc()始终提供唯一的ID,则这一点也不成立?@hfontanez问题似乎不是重复的问题,问题的意图和提出的确切问题完全不同。没有检查其他副本,但它肯定不是上述问题的副本。非常感谢!您知道
.doc()
是否会将id“保留”一段时间吗?假设我的目标是在一个进程中异步创建数千个文档,那么有可能获得重复的文档吗?我知道这不太可能,因为它的长度等等,但我只是从理论的角度考虑。嗨,Tobias,介绍了这个问题的异步性质,我不确定在某个时候ids是否会发生冲突。我不认为这会成为一个问题,但还没有在生产中测试过这种情况。根据这里提供的答案:由于id是在客户端生成的,所以几乎不可能获得重复的id。
const newCityRef = db.collection('cities').doc();
// Later...
const res = await newCityRef.set({
// ...
});