使用云功能将文档复制到 Firestore 中的新集合中
Posted
技术标签:
【中文标题】使用云功能将文档复制到 Firestore 中的新集合中【英文标题】:Copy a document into a new collection in firestore using cloud function 【发布时间】: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
)
;
【问题讨论】:
【参考方案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】:我没有看到任何可以让您在集合之间移动文档的东西(如果我错了,请有人纠正我)。您必须从旧集合复制到新集合,然后删除旧集合。
这是 *** 上的另一个 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 块的情况下抛出异步函数内部,或拒绝承诺 我也编辑了我的代码。你可以在上面查看以上是关于使用云功能将文档复制到 Firestore 中的新集合中的主要内容,如果未能解决你的问题,请参考以下文章
Firestore 中的重复文档可以通过文档编辑的云功能进行更新吗?