我正在尝试通过云函数在我的 firebase 集合中插入数组。 我需要在一个文档中有多行,所以我为每一行插入一个数组。 请检查我附加的屏幕截图,您可以在其中看到 line0 ,与我需要在同一文档中包含 Line1,Line2,Line3..,Line n 的方式相同。

对于 line0,我正在从如下代码传递数组,并且它工作正常。

admin.firestore().collection("qbContestWinners").add(
        {
            'cmpientryid': context.params.processId,
            'qbid': '',
            'qbsyncdate': '',
            'qbsyncstatus': 'pending',
            'Line0':
            {
                id: "0",
                description: 'PRIZE AMOUNT',
                amount: 1000,
                accountrefid: contestresultData.qbcontestid,
                accountrefname: contestresultData.qbcontestname,
                contestresultId: context.params.processId,
            },
        })

当我循环遍历从另一个表获取的数据时,我无法生成正确的 JSON 以进行插入。

下面是我在从另一个表获取数据后循环和创建 JSON 的方式。

   i = 1;
            admin.firestore().collection("results").where('cid', '==', 'LKRRk2XXXXXXXX')
            .orderBy("rank", "asc").get().then(snapshots =>
                        {
                            snapshots.forEach(doc =>
                                {
                                    const contestresultId = doc.id;
                                    const prizeAmount = doc.data().prizeamt;
                                    const userId = doc.data().userid;
                                    const lineNum = "Line" +  i;
                                    console.log("new line numner is: ", lineNum);
                                    console.log(`lineNum? ${lineNum}`);

                                    const linetxt = "Line" + String(i);
                                    const insertData = "{"+linetxt +
                                                        ":{id:'" + i +
                                                         "', description: 'PRIZE AMOUNT'"+
                                                           ", amount:" + prizeAmount + "," +
                                                           "accountrefid:"+ contestresultData.qbcontestid +","+
                                                           "accountrefname:'" +contestresultData.qbcontestname +"',"+
                                                           "contestresultId:'" + contestresultId +"'," +
                                                       "},}"
                                      const finalInsert = JSON.stringify(insertData);
                                      const finalJSON = JSON.parse(finalInsert);
                                       admin.firestore().collection("qbContestWinners").doc(mainID).set(

                                         finalInsert.toJSON(),

                                    {
                                        merge: true
                                    });

                                i= i+1;
                            });
            });

使用此代码我收到错误finalInsert.toJSON is not a function 在此处输入图片说明

#1楼 票数:2 已采纳

实际上, Line0字段是地图而不是数组,有关更多详细信息,请参阅此文档

因此,如果您想创建类似的字段( Line1Line2 、...),您只需将一个 JavaScript 对象传递给set()方法,如下所示:

snapshots.forEach(doc => {
        const contestresultId = doc.id;
        const prizeAmount = doc.data().prizeamt;
        const userId = doc.data().userid;
        const lineNum = "Line" +  i;
        console.log("new line numner is: ", lineNum);
        console.log(`lineNum? ${lineNum}`);

        const lineObj = {
            id: i,
            description: 'PRIZE AMOUNT',
            accountrefid: contestresultData.qbcontestid,   //Not sure if you have defined contestresultData somewhere...
            //...
        }

        const dataObj = {};
        dataObj["Line" + i] = lineObj   // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_accessors

        admin.firestore().collection("qbContestWinners").doc(mainID).set(dataObj, {merge: true});

        i= i+1;
});

但是,请注意,当 Cloud Function 中的所有异步工作完成(即调用 Firestore set()方法)时,您必须返回一个可解决的承诺。

这在 Firebase 官方视频系列中进行了解释,特别是观看标题为“Learn JavaScript Promises”的三个视频。

由于您在forEach循环中多次调用set()方法,因此您需要使用Promise.all()以便在对set()方法的所有这些并行调用完成后返回一个 Promise。

以下应该可以解决问题:

let i = 1;
return admin.firestore().collection("results")    // <-- See the return here
.where('cid', '==', 'LKRRk2XXXXXXXX')
.orderBy("rank", "asc").get()
.then(snapshots => {
    const promises = [];

    snapshots.forEach(doc => {
            const contestresultId = doc.id;
            const prizeAmount = doc.data().prizeamt;
            const userId = doc.data().userid;
            const lineNum = "Line" +  i;


            const lineObj = {
                id: i,
                description: 'PRIZE AMOUNT',
                accountrefid: contestresultData.qbcontestid,
                //...
            }

            const dataObj = {};
            dataObj[lineNum] = lineObj;

            promises.push(admin.firestore().collection("qbContestWinners").doc(mainID).set(dataObj, {merge: true}));

        i= i+1;
    });

    return Promise.all(promises)  // <-- See the return here
});

最后一点:如果mainIDsnapshots.forEach循环中保持相同的值,您可以采用完全不同的方法,包括构建一个具有多个LineXX属性的 JavaScript 对象,并且只调用一次set()方法。 由于您没有共享 Cloud Function 的整个代码,因此无法确定是否应该使用这种方法。

#2楼 票数:0

首先到错误

您对字符串进行字符串化和解析。 这里的问题似乎是顺序。 您必须解析“字符串”并将“对象”字符串化。 结果也不会有 toJSON 方法,但是您可以将对象字符串化以获取 json。

第二件事

为什么要使用字符串来创建对象? 你不应该。 只需使用一个对象。

第三件事

您不应该将对象用作数组。 甚至没有在火力基地。

只需使用数组。 例子:

[Line0Object, Line1Object, ...]

提示:如果你的数组可以作为它自己的集合工作。 只需使用一个子集合。 这可能符合您的需求。

  ask by shruti tupkari translate from so

未解决问题?本站智能推荐:

2回复

如何从firestore获取数据到谷歌云功能?

我的 index.js 文件: flutter项目中的代码: 程序打印出 null,即使集合“dogs”中的文档存在,id 为“11”,字段名。 我正在尝试从 firestore 获取特定数据并将其返回。 控制台没有显示任何错误,如果我返回任何其他内容,它会正常打印出来。 除了使用以下触发器的文档
1回复

我可以使用firebase_functions_interop从CloudFunction向Firestore进行“集合组查询”吗?[关闭]

请我需要一些帮助: 我可以使用firebase_functions_interop从Cloud Function向Firestore进行“集合组查询”吗? firebase_functions_interop: https : //github.com/pulyaevskiy/fireb
1回复

我在firebase函数中的onCreate函数没有在云数据库中创建我想要的集合

我刚刚在我的 index.js 函数文件(firebase CLI)中输入了一个代码。根据我的代码,必须在 firebase 的云数据库中创建一个时间线集合。函数是健康的,它被部署没有错误,甚至在记录一切正常。 但是当我在我的应用程序中关注用户时,仍然没有在云数据库中创建时间线集合。 这是我的代码:
1回复

Flutter/Firebase:管理功能是应用内功能还是云功能?

我正在使用 Flutter 和 Firebase 编写一个应用程序(目前使用 Firestore、Storage 和 Authentication)。 目前该应用程序显示来自 Firebase 的内容,但现在我正在尝试找出在 Firebase 中实现写入/编辑/删除内容的最佳方法。 目标是让用户拥有
1回复

如何从云功能返回“文档引用实例”到Flutter?

我有一个云函数,其中包含以下三行:const admin = require("firebase-admin");const db = admin.firestore();db.doc(path); 我在整个函数中广泛使用这三行来与 firestore 进行交互。 他们甚至将文档引用保存在 fire
1回复

Firebase:云函数触发器:新集合中的六个隐藏“_xxxxx”文档触发云函数

我最近将我的 google 云函数升级到 Node.js 10。我在新集合中遇到了奇怪的隐藏文档触发云函数的情况。 这些是文件: _创建时间 _fieldsProto _读取时间 _ref _序列化器 _更新时间这些文档字符串名称在我的代码中不存在。 但它们确实存在于 DocumentSnap
7回复

使用云功能时,firestore中的时间戳会转换为地图

所以我在云 Firestore 中有一个Timestamp 。 我正在使用云功能从 Firestore 检索数据以进行颤振。 但是JSON格式化时间戳以进行映射,因此我无法将其用作时间戳。 如何再次将其转换为时间戳? 这就是我将时间戳添加到 firestore 的方式。var reference =
2回复

使用typrescript和if语句的云函数

你好,我是云函数的新手,我想问一下是否有一些为什么要在一个 if 语句中获得多个主题,这里是我的云函数: 问题是我有多个主题,我想做的是检查其他集合上文档的创建并基于此发送通知,我真的不知道该怎么做,有什么帮助吗?