当前位置: 首页 > 知识库问答 >
问题:

使用云函数将文档复制到firestore中的新集合中

丁文轩
2023-03-14

路径1-match_creator/cricket/matchlists;路径2-match_creator/cricket/completedmatchlists;我有一个名为matchList(路径1)的集合,其中有一个名为C434108的文档。现在我想把这个docc434108)移动到路径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;

复制此docc434108)之后,我想从路径1中删除此docc434108)。

我的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
  )
};

共有2个答案

席安康
2023-03-14

我能解决我的问题。

这是我的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
  )
};

null

寿毅庵
2023-03-14

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

这是关于StackOverflow的另一篇文章,也遇到了同样的问题,有人提供了关于如何实现它的Java代码。

编辑:更新链接。

希望这能帮上忙。

 类似资料:
  • 我有一个困扰我好几天的问题。我正在尝试创建一个从Firestore数据库读取的Firebase云函数。 我的Firestore DB如下所示: 问题是我无法像这样列出: 如果我尝试这样做,我会得到空响应,就像我的集合中没有用户一样。 但我尝试直接访问用户它可以工作: 我的完整代码: 有人知道我做错了什么吗?非常感谢。

  • 我在Firebase Firestore中收集了一些文档,比如:

  • 我所处的情况是,当用户付款时,存储在Firestore集合(CartProducts)中的购物车产品应移动到名为SuccessFullOrders的新集合。 因此,我的基本问题是如何在Flutter中将所有文档从一个集合移动到Firestore的另一个集合 我不知道如何在flutter中编写代码。谢谢你的回答 这是我的代码

  • 当用户购买产品并按条支付时,我在自动化工作流程的集成方面有点困难。我正在使用火力还原和云功能。 工作流程 > 用户通过条纹Checkout.js购买产品 付款存储在付款集合中 触发云功能(付款收款的onWrite) TODO:将文档添加到集合“用户”文档中的“采购”集合 费用支付 除了第4步和第5步之外,我已经实现了这个工作流,因为我不知道如何在云函数中从Firestore检索和添加DocRef(

  • 我如何删除一个特定的文档中的一个集合在fiRecovery使用反应? 我在这里和谷歌上看了看,但我没有发现任何内在相关的东西。 我只是设法从我的集合中删除索引[0]的文档。 这状态idDoc接收所有id文档。 如果我只是传递. doc(idDoc),我会得到以下错误: Firebase Error: Function Collection Reference.doc()要求它的第一个参数是非空字符