firebase Firestore:添加/更新文档后,无需额外的网络调用即可将其取回

jobtbby3  于 2023-03-19  发布在  其他
关注(0)|答案(5)|浏览(207)

在添加/更新文档后,是否可以在不使用Firestore进行额外网络调用(类似于MongoDB)的情况下取回文档?
我发现先打电话添加/更新文档,然后再打电话获取它是愚蠢的。

jrcvhitl

jrcvhitl1#

正如您可能在Node.js(和Javascript)SDK的文档中看到的那样,无论是DocumentReference的方法还是CollectionReference的方法,这都是不可能的。
更准确地说,DocumentReferenceset()update()方法都返回包含void的Promise,而CollectionReferenceadd()方法返回包含DocumentReference的Promise.
旁注(与下面Darrinm的回答一致):值得注意的是,使用Firestore REST API时,当您创建文档时,您会返回(即通过API端点响应)一个Document对象。

tnkciper

tnkciper2#

当您将文档添加到Cloud Firestore时,服务器可能会影响存储的数据。这可能会发生以下几种情况:

  • 如果您的数据包含服务器端时间戳的标记,则服务器会将该标记扩展为实际的时间戳。
  • 根据服务器端安全规则,您的数据data不被允许,服务器将拒绝写入操作。

由于服务器会影响Document的内容,客户机不能简单地将已有的数据作为新文档返回,如果只想在客户机中显示发送到服务器的数据,当然可以重用传递给setData(...)/addDocument(data: ...)的对象。

yhived7q

yhived7q3#

这似乎是Firestore Javascript API的一个任意限制。Firestore REST API在同一次调用中返回更新后的文档。
https://firebase.google.com/docs/firestore/reference/rest/v1beta1/projects.databases.documents/patch

kiz8lqtg

kiz8lqtg4#

我也在尝试相同的方法,但是,我注意到我的代码中已经有了数据。所以,我决定更新我的当前对象,而不是取回文档。如下所示:

// Get the current document, e.g. some user
const querySnapshot = await firebase
    .firestore()
    .collection('users')
    .doc(docId)
    .get()

// Get the data, e.g. user data
let userData = querySnapshot.doc.data()
// Some business logic
...

if (condition) {
    // update document
    await firebase
        .firestore()
        .collection('users')
        .doc(docId)
        .update({phone: someNumber})
    
    // Update your current data
    userData.phone = someNumber
}

它节省了一个网络呼叫,并完成了我们的意图。
此外,如果打算创建一个新文档,然后将其用作引用,则可以将新创建的文档的id存储在一个变量中:

if (!userData) {
    const newUser = {name: someName, address: someAddress}
    const res = await firebase
        .firestore()
        .collection('users')
        .add({ ...newUser })
    userData = newUser
    userData.id = res.id
}

希望这有帮助!

doinxwow

doinxwow5#

我这样做是为了获取创建的新文档的ID,然后在其他地方使用它。

Future<DocumentReference<Object>> addNewData() async {
  final FirebaseFirestore _firestore = FirebaseFirestore.instance;
  final CollectionReference _userCollection = _firestore.collection('users');

  return await _userCollection 
    .add({ 'data': 'value' })
    .whenComplete(() => {
      // Show good notification
    })
    .catchError((e) {
      // Show Bad notification
    });
}

在这里我得到了ID:

await addNewData()
  .then((document) async {
    // Get ID
    print('ID Document Created ${document.id}');
  });

希望能有所帮助。

相关问题