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

Firestore-点表示法是否适用于set()?

隗嘉歆
2023-03-14

我正在尝试运行以下代码:

function updateUserLimitations(userId, limitations, batchOrTransaction = undefined) {
  const userLimitationsRef = firestore
    .collection("users")
    .doc(userId)
    .collection("limitations")
    .doc("userLimitations");

  if (batchOrTransaction) {
    return batchOrTransaction.set(
      userLimitationsRef,
      limitations,
      { merge: true }
    );
  }

  return userLimitationsRef.set(limitations, { merge: true });
}

UpdateUserLimitions(用户ID,{“messages.totalMessages”:admin.firestore.FieldValue.increment(1)});

但是...

而不是在我的数据库中获取此文档数据:

{ // Doc data
   messages: {
      initialDate: timestamp, // Date of the first message (I need to preserve it),
      totalMessages: 20,
   },
}

我得到:

{
   ...other doc data...,
   messages.totalMessages: 20,
}

我需要带有合并选项的集合,因为如果文档不存在,我正在更新和创建。。。。

有什么想法吗?我做错什么了吗?

共有3个答案

单于阳
2023-03-14

使用我当前的实现

function updateUserLimitations(userId, limitations, batchOrTransaction = undefined) {
  const userLimitationsRef = firestore
    .collection("users")
    .doc(userId)
    .collection("limitations")
    .doc("userLimitations");

  if (batchOrTransaction) {
    return batchOrTransaction.set(
      userLimitationsRef,
      limitations,
      { merge: true }
    );
  }

  return userLimitationsRef.set(limitations, { merge: true });
}

我也可以深度更新文档消息字段,如下所示:

updateUserLimitations(
   userId,
   { 
      messages: {
        totalMessages: admin.firestore.FieldValue.increment(1),
      }
   }
);

它保留所有以前存在的对象字段并更新特定的字段。

{ // Doc data
  messages: {
    initialDate: timestamp, // PRESERVED!
    totalMessages: 21,
  },
}
年健
2023-03-14

如果只需要更新,请使用update()函数而不是set()。因此,请更改以下代码行:

return userLimitationsRef.set(limitations, { merge: true });

到:

return userLimitationsRef.update(limitations);

以及您的:

updateUserLimitations(userId, { "messages.totalMessages": admin.firestore.FieldValue.increment(1) });

它将按预期工作。如果要在不存在时添加,那么确实应该使用set()函数。

严俊彦
2023-03-14

可以使用对象“设置”嵌套数据:

{
  messages: {
    totalMessages: 20,
  }
}

“点”表示法用于对嵌套数据应用更新。

 类似资料:
  • 我正在将tomcat服务器从tomcat7升级到Tomcat8。但Struts1.1似乎不能在Tomcat8上工作。有人知道Tomcat8不支持Struts1.1吗。 下面是堆栈跟踪

  • 问题内容: 为了进行快速测试,调试,创建可移植的示例和进行基准测试,R提供了许多数据集(在Base R包中)。R提示符下的命令描述了近100个历史数据集,每个数据集都有相关的描述和元数据。 Python有这样的东西吗? 问题答案: 您可以使用package从Python访问所有R数据集。 设置界面: 然后使用可用数据集的任何数据集名称进行调用(就像中的一样) 要查看可用数据集的列表以及每个数据集的

  • 问题内容: 特别是,我正在编写Django RESTful API来支持iOS应用程序,每当编写用于处理POST请求的方法时,我都会不断遇到Dj​​ango的CSRF保护。 我的理解是,iOS管理的cookie不会被应用程序共享,这意味着我的会话cookie是安全的,并且没有其他应用程序可以使用它们。这是真的?如果是这样,我可以将我所有的API函数都标记为CSRF免除吗? 问题答案: 那不是CSR

  • 我已经完成了如下的 nuget 安装: 关于我的测试项目。 我有一个类似的测试: 我能做些什么来解决这个问题并查看我的测试? 补遗 我在4.6.1下工作,所以还不是核心。 关于同一个主题但没有帮助的问题: 为什么xunit运行程序找不到我的测试 此响应 和这个类似的 xunit.runner。visualstudio无法在Visual Studio 2013更新4上工作 所以到处都有,但都没用..

  • 问题内容: 我正在尝试使用选择器将图像放置在另一个图像上,但是我发现将图像放置在一个元素之前(仅在其他某个元素之前)根本不起作用。具体来说,我的风格是: 我发现这很好用: 但这不是: 我可以使用或元素代替它,浏览器可以将我的图像正确地覆盖在该元素中的图像上,但是如果我将overlay类应用于自身,则无法正常工作。 我希望这项工作能够正常进行,因为这会让我感到不舒服,但更重要的是,我有大约100个我

  • 我已经使用GCM创建了一个应用程序,它可以在Android平台4.1和4.03上正常运行(即获取RegId并在我的服务器中注册自己,甚至可以接收GCM),但是当我启动Android 2.3(API 10)模拟器时,该应用程序会被安装但从未注册,即从未获取RegId。当我第一次启动(安装)应用程序时,它会收到一条GCM消息,我不知道该消息来自何处,但我可以看到该设备未在我的服务器中注册。我还使用了H