如何在 Firebase Firestore 中使用 arrayUnion() 推送数组中的对象?

Nak*_*ena 2 node.js express firebase google-cloud-firestore

我当前的文档如下所示:

{
    "assignmentName": "OS Assignment-2",
    "dueDate": "10 August",
    "createdAt": "2020-08-02T20:27:28.916Z",
    "maxMarks": 10,
    "facutyName": "Dr. Muskan Gupta",
    "semester": "3",
    "submittedBy": [
        {
            "studentName": "Test name",
            "downloadUrl": "URL"
        },
        {
            "downloadUrl": "URL3",
            "studentName": "Test name2"
        },
        {
            "downloadUrl": "https://downloadthisfile.com",
            "studentName": "Nakshatra Saxena"
        },
        {
            "studentName": "Hello Bortehr",
            "downloadUrl": "httpsav"
        }
    ],
    "program": "CSE",
    "subject": "Operating System with UNIX"
}
Run Code Online (Sandbox Code Playgroud)

我想在“submittedBy”字段中推送一个对象,但出现错误。我现在使用的代码是:

const submittedAssignment = {
    studentName: req.body.studentName,
    downloadUrl: req.body.downloadUrl,
    };
    admin
        .firestore()
        .collection("assignments")
        .doc(req.params.assignmentId)
        .update({
          submittedBy: firebase.firestore.FieldValue.arrayUnion(submittedAssignment)
        });
    })
    .then(() => {
      return res
        .status(201)
        .json({ message: `Assignment submitted successfully` });
    })
    .catch((err) => {
      console.error(err);
      res.status(500).json({ error: `Error submitting assignment` });
    });
Run Code Online (Sandbox Code Playgroud)

但我收到这个错误

错误:Update() 需要单个 JavaScript 对象或可以后跟可选前提条件的字段/值对交替列表。参数“dataOrField”的值不是有效的 Firestore 文档。无法序列化“FieldValueDelegate”类型的对象(在“submittedBy”字段中找到)。Firestore 不支持具有自定义原型的 JavaScript 对象(即通过“new”运算符创建的对象)。

Dou*_*son 7

您正在混淆 Firestore SDK。如果您使用 Admin SDK 进行更新,您还需要使用 Admin SDK 来指定 FieldValue 类型值。

取而代之的是:

      submittedBy: firebase.firestore.FieldValue.arrayUnion(submittedAssignment)
Run Code Online (Sandbox Code Playgroud)

用这个:

      submittedBy: admin.firestore.FieldValue.arrayUnion(submittedAssignment)
Run Code Online (Sandbox Code Playgroud)