使用 set 仅更新 Firestore 事务中的写入属性的子集
Using set to only update a subset of write properties in a Firestore transaction
是否可以使用 set
(在事务的上下文中)创建包含某些对象的文档,但仅 更新 它具有属性的子集?
例如,我有一个用例,我想创建或更新一个文档,但在更新用例中,只有某些字段应该被合并。在下面的代码中,created
应该只写在文档创建时(而不是更新时)。
我在 SetOptions
中尝试了 mergeFields
,我认为它只适用于更新情况,但似乎也适用于写入情况并导致 created
创建文档时省略。
如果这是 SetOption
的预期行为,还有其他方法可以实现吗?
t.set(docRef,
{
name: 'Alice',
updated: admin.firestore.FieldValue.serverTimestamp(),
created: admin.firestore.FieldValue.serverTimestamp(),
},
{ mergeFields: ['name', 'updated'] });
Node.js 管理 SDK 9.2.0
您的 transaction will first have to read the document with get() 似乎需要创建或更新,然后决定将什么传递给 set()
以确保文档包含正确的字段。一个 set()
无法为您做出此决定。所以,像这样:
const snap = await t.get(docRef)
if (snap.exists) {
t.update(docRef, ...)
}
else {
t.create(docRef, ...)
}
是否可以使用 set
(在事务的上下文中)创建包含某些对象的文档,但仅 更新 它具有属性的子集?
例如,我有一个用例,我想创建或更新一个文档,但在更新用例中,只有某些字段应该被合并。在下面的代码中,created
应该只写在文档创建时(而不是更新时)。
我在 SetOptions
中尝试了 mergeFields
,我认为它只适用于更新情况,但似乎也适用于写入情况并导致 created
创建文档时省略。
如果这是 SetOption
的预期行为,还有其他方法可以实现吗?
t.set(docRef,
{
name: 'Alice',
updated: admin.firestore.FieldValue.serverTimestamp(),
created: admin.firestore.FieldValue.serverTimestamp(),
},
{ mergeFields: ['name', 'updated'] });
Node.js 管理 SDK 9.2.0
您的 transaction will first have to read the document with get() 似乎需要创建或更新,然后决定将什么传递给 set()
以确保文档包含正确的字段。一个 set()
无法为您做出此决定。所以,像这样:
const snap = await t.get(docRef)
if (snap.exists) {
t.update(docRef, ...)
}
else {
t.create(docRef, ...)
}