Firebase 如何在之前创建的文档中添加字段?

Firebase 如何在之前创建的文档中添加字段?,firebase,google-cloud-firestore,Firebase,Google Cloud Firestore,我需要将在Dialogflow console中输入的一些详细信息存储到Firestore数据库中 我有以下代码: index.js const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(functions.config().firebase); exports.dialogflowFirebaseFulfillment = f

我需要将在Dialogflow console中输入的一些详细信息存储到Firestore数据库中

我有以下代码:

index.js

const functions = require("firebase-functions");
const admin = require("firebase-admin");

admin.initializeApp(functions.config().firebase);

exports.dialogflowFirebaseFulfillment = functions.https.onRequest(
  (request, response) => {
    let action = request.body.result.action;

    var Name = request.body.result.parameters.Name;

    let params = request.body.result.parameters;

    var Answer1 = request.body.result.parameters.Answer1;

    let query = request.body.result.resolvedQuery;

    const parameters = request.body.result.parameters;

    const inputContexts = request.body.result.contexts;

    console.log("Parameters is" + params);
    console.log("Answer1 is " + Answer1);
    console.log("Helllo");
    console.log("action is " + action);

    if (action == "save.name") {
      admin
        .firestore()
        .collection("users")
        .doc(Name)
        .set({
          name: Name,
          answer: ""
        })
        .then(ref => {
          var doc = admin
            .firestore()
            .collection("users")
            .doc(Name)
            .get();
          console.log("Added new user");
          console.log("Name is " + Name);
          console.log("ref id is:" + ref.id);
        });
    }
    //const ref = this.Name;
    if (action == "save.answer1") {
      //   var Name = this.request.body.result.parameters.Name;
      console.log("name in second if", Name);
      admin
        .firestore()
        .collection("users")
        .doc(doc)
        .update({
          answer: Answer1
        })
        .then(ref => {
          console.log("Added new user");
          console.log("Name is " + Name);
          console.log("ref id is:" + ref.id);
        });
    }
  }
);
此代码成功地将名称添加到数据库中,然后退出代码并再次重新输入以保存Answer1,因此我不知道如何引用添加名称的文档,如果我硬编码用户先前输入的“名称”,则它会将Answer1添加到同一文档下

例如:

if (action == "save.answer1") {
       admin
        .firestore()
        .collection("users")
        .doc("ABC")
        .update({
          answer: Answer1
        })
我在这里将文档名称硬编码为ABC,因此它在文档下添加了答案1,如何避免硬编码名称

我需要获取存储名称的文档的DocumentId,以便添加应答1

预期产出为:

首先-不要试图查找查找“最后添加的文档”的查询。我不知道它是否存在,但是如果您有两个不同的用户在不同的会话中添加文档,然后尝试更新它们,那么它会做错误的事情。这是一种比赛状态,非常糟糕

相反,您可以做的是将文档标识符(您的案例中的名称)保存在Dialogflow中的参数中。然后,下次调用webhook时,可以从该上下文中检索参数,并在
.doc()
引用中使用该参数

您没有显示如何将消息发送回Dialogflow,但看起来您可能正在使用Dialogflow V1 JSON。如果是这样,您应该在
contextOut
属性下的响应中重新设置上下文。这将是一个要设置的上下文数组。因此,JSON片段的这一部分可能类似于:

  "contextOut": [
    {
      "name": "doc_name",
      "lifespan": 5,
      "parameters": {
        "name": Name
      }
    }
  ]
在处理“save.answer1”操作时,您将遍历传入的上下文以找到正确的上下文,并在更新中使用此名称。所以这一部分可能看起来像这样:

if (action == "save.answer1") {
  var Name;
  for( var co=0; inputContexts && co<inputContexts.length && !Name; co++ ){
    var context = inputContexts[co];
    if( context.name == 'doc_name' ){
      Name = context.parameters.name;
    }
  }
  console.log("name in second if", Name);
  admin
    .firestore()
    .collection("users")
    .doc(Name)
    .update({
      answer: Answer1
    })
    .then(ref => {
      console.log("Updated user");
      console.log("Name is " + Name);
      console.log("ref id is:" + ref.id);
    });
}
if(操作==“save.answer1”){
变量名;
对于(var co=0;inputContexts&&co){
console.log(“更新用户”);
console.log(“名称为”+Name);
控制台日志(“参考id为:”+ref.id);
});
}

谢谢!此代码工作正常并成功地将
answer1
添加到文档中,此代码是否也适用于向同一文档添加更多字段?如果(context.name==“doc\u name”)部分加载您保存在上下文中的文档的名称。我不知道你在那里存了什么。如果您仍然存在问题,创建一个新的StackOverflow问题可能是最好的。我在尝试向数据库添加更多字段时出错,我在每次更新字段后都更新了
If(context.name==“doc_name”)
,但它仍然抛出
参数“documentPath”不是有效的资源路径。路径必须是非空字符串。
错误。请创建一个新问题,并准确显示您正在执行的操作以及遇到的错误。我创建了一个问题,解释了所有问题,请访问此网站: