【问题标题】:Copy a document into a new collection in firestore using cloud function使用云功能将文档复制到 Firestore 中的新集合中
【发布时间】:2020-04-04 15:00:10
【问题描述】:

路径 1 - Match_Creator/cricket/matchList; 路径 2 - Match_Creator/cricket/completedMatchList; 我有一个名为 matchList (Path 1) 的集合,其中我有一个名为 c434108 的文档。 现在我想将此 doc(c434108) 移动到路径 2;

/* eslint-disable promise/catch-or-return */
const functions = require("firebase-functions");
const admin = require("firebase-admin");

const { db } = require("./db/index");

const createCompletedMatchListDoc = (request, response) => {
  completedMatchDocsData();
};

function completedMatchDocsData() {
  createNewCompletedMatchDocs()
 }

function getOldCompletedMatchDocs(){

  var completedMatchesRef = db
  .collection("Match_Creator")
  .doc("cricket")
  .collection("matchList");

  var completedMatchDocData;
  var completedMatchDataArr = [];

return new Promise(resolve => {
    let query = completedMatchesRef
      .where("status", "==", "live")
      .get()
      .then(snapshot => {
        // eslint-disable-next-line promise/always-return
        if (snapshot.empty) {
          console.log("No matching documents.");
          return;
        }

        snapshot.forEach(doc => {
          completedMatchDocData = doc.data();     
          completedMatchDataArr.push(completedMatchDocData);
          resolve(completedMatchDataArr);
        });
        console.log("sarang", completedMatchDataArr[2]);
      })
      .catch(err => {
        console.log("Error getting documents", err);
      });
    });
}

const createNewCompletedMatchDocs = (async(change, context) => {
  let completedMatchData = await getOldCompletedMatchDocs();

  console.log('aman', completedMatchData[1]);

  const newValue = change.after.data();
  const previousValue = change.before.data();

  const st1 =newValue.status;
  const st2 = previousValue.status;
  console.log('I am a log entry' + st1 + ' ' + st2);

  var data = completedMatchData[0];

  return db.collection('Match_Creator').doc('cricket').collection('completedMatchList').add(data)
  .catch(error => {
    console.log('Error writting document: ' + error);
    return false;
  });
})

module.exports = createCompletedMatchListDoc;

复制此文档(c434108)后,我想从路径 1 中删除此文档(c434108)。

而我的 index.js 文件是:

const functions = require("firebase-functions");
const admin = require("firebase-admin");
const storeMatchData = require("./liveScoring");
const createCompletedMatchListDoc = require("./completedMatchList");

var http = require("https");

module.exports = {
  liveScoring: functions.https.onRequest(storeMatchData),
  createCompletedMatchListDoc: functions.https.onRequest(
    createCompletedMatchListDoc
  )
};

【问题讨论】:

    标签: javascript node.js google-cloud-functions


    【解决方案1】:

    我能够解决我的问题。

    这是我的 completeMatchList.js 文件

    /* eslint-disable promise/catch-or-return */
    const functions = require("firebase-functions");
    const admin = require("firebase-admin");
    
    const { db } = require("./db/index");
    
    const createCompletedMatchListDoc = (request, response) => {
      completedMatchDocsData();
    };
    
    function completedMatchDocsData() {
      setNewCompletedMatchDocs()
     }
    
    function getOldCompletedMatchDocs(){
    
      var completedMatchesRef = db
      .collection("Match_Creator")
      .doc("cricket")
      .collection("matchList");
    
      var completedMatchDocData;
      var completedMatchDataArr = [];
    
    return new Promise(resolve => {
        let query = completedMatchesRef
          .where("status", "==", "live")
          .get()
          .then(snapshot => {
            // eslint-disable-next-line promise/always-return
            if (snapshot.empty) {
              console.log("No matching documents.");
              return;
            }
    
            snapshot.forEach(doc => {
              // completedMatchDocData = doc.data();
              completedMatchDocData = {
                docId: "",
                docData: ""
              } 
              completedMatchDocData.docId = doc.id;
              completedMatchDocData.docData = doc.data();
    
              completedMatchDataArr.push(completedMatchDocData);
              resolve(completedMatchDataArr); // Here i am getting the data and pushing it in array
            });
            console.log("sarang", completedMatchDataArr);
          })
          .catch(err => {
            console.log("Error getting documents", err);
          });
        });
    }
    
    const setNewCompletedMatchDocs = (async () => {
      let getCompletedMatchData = await getOldCompletedMatchDocs();
      // console.log("balram", getCompletedMatchData[0].docId);
      let newCompletedMatchDocRef = db.collection("Match_Creator").doc("cricket").collection("completedMatchList").doc(getCompletedMatchData[0].docId);
      return newCompletedMatchDocRef.set(getCompletedMatchData[0].docData); //set/copy the data to new path.
    })
    

    这是我的主要 index.js 文件

    const functions = require("firebase-functions");
    const admin = require("firebase-admin");
    const storeMatchData = require("./liveScoring");
    const createCompletedMatchListDoc = require("./completedMatchList");
    
    const { db } = require("./db/index");
    
    var http = require("https");
    
    module.exports = {
      liveScoring: functions.https.onRequest(storeMatchData),
      createCompletedMatchListDoc: functions.https.onRequest(
        createCompletedMatchListDoc
      )
    };
    
    

    现在将文档数据复制到新路径后,我将删除以前的文档。对于删除文档我没有写函数。

    【讨论】:

      【解决方案2】:

      我没有看到任何可以让您在集合之间移动文档的东西(如果我错了,请有人纠正我)。您必须从旧集合复制到新集合,然后删除旧集合。

      这是 StackOverflow 上的另一个 post 遇到了同样的问题,有人提供了有关如何实现它的 Java 代码。

      编辑:更新链接。

      希望这会有所帮助。

      【讨论】:

      • 我知道我无法在集合之间移动文档。我只能复制数据。您提供的链接是基于角度的,但我希望它在 javascript 或 nodejs 中
      • 我粘贴了错误的链接,我用我提到的 Java 链接更新了帖子。
      • 我已在我的问题中更新了我的代码。当我尝试将我从 getOldCompletedMatchDocs() 函数获取的数据添加/复制到我试图在 createNewCompletedMatchDocs() 函数中执行的新路径时。我收到一个错误
      • 我得到的错误:UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'after' of undefined > at createNewCompletedMatchDocs (/Users/amansankrit/Desktop/predicta-function/functions/completedMatchList.js:54:27 ) > 在 process._tickCallback (internal/process/next_tick.js:68:7) > (node:3264) UnhandledPromiseRejectionWarning: 未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝承诺
      • 我也编辑了我的代码。你可以在上面查看
      猜你喜欢
      • 2020-05-23
      • 2019-08-07
      • 2021-03-27
      • 2018-05-19
      • 2019-06-04
      • 2018-09-16
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      相关资源
      最近更新 更多