繁体   English   中英

Firebase Firestore:有没有办法为集合中的所有文档强制执行必填字段?

[英]Firebase Firestore: Is there a way to enforce required fields for all documents in a collection?

我正在为我正在创建的应用程序手动添加数据。 我必须将许多文档添加到一个集合中,所有这些文档都必须包含相同的 5 个字段。 有没有办法在Firebase控制台新建文档的时候自动创建这些字段? 并且还强制所有文件都有这 5 个字段(这样我就不会犯错误)?

此外,是否有比从 Firebase 控制台手动添加此数据更好的方法? 例如通过JSON?

这里有两个不同的问题。 之前都已经回答过这两个问题,但从来没有在一个问题中回答过,所以我会在这里回答。

您可以为集合中的新文档设置默认值吗?

这不可能。 您将明确地将这些值写入您创建的每个新文档中。

您能否强制集合中的新文档具有某些字段的值?

这可以通过使用 Firebase 的服务器端安全规则来实现。

例如,要确保文档具有field1field2field3 ,您可以使用hasAll

allow write: if resource.data.keys().hasAll(['editor', 'admin']);

在文档上设置默认值的一种选择是使用onCreate 触发器实现云函数,然后在创建时查看每个新文档,如果不存在则添加默认值。 请注意,这并不完美,因为在创建对象和运行函数之间会有一些非零时间,但对于某些情况可能就足够了。

下面是这样一个函数的样子:

const functions = require('firebase-functions');

exports.setDefaultValueFirestore = functions.firestore.document('defaultDemo/{someDoc}')
    .onCreate(async (snap, context) => {
      if(!('defaultWanted' in snap.data())) {
        return snap.ref.set({
          'defaultWanted': 'my default value'
        }, {merge: true});  
      } else {
        return Promise.resolve();
      }
    });

这会将/defaultDemo创建的任何文档上的defaultWanted字段设置为my default value

但是,如果可以的话,使用安全规则并让客户端始终按照@Frank 的建议提供所需的字段可能会更稳定。

截至目前,无法设置默认值。

您可以使用is运算符来强制执行必填字段。 除了使用正确的数据类型外,它将确保字段不是 null。 有关详细信息,请参阅强制字段类型

例如,要确保文档具有user_idorigin为 map 并且在origin object 中具有某些属性,您可以使用以下规则:

match /requests/{doc} {
    allow create: if (request.auth != null) && 
      request.resource.data.user_id is string &&
      request.resource.data.origin is map && 
      request.resource.data.origin.name is string &&
      request.resource.data.origin.is_pinned is bool;
}

我认为它比hasAll更好,因为hasAll只检查密钥是否存在但不会阻止用户添加null值。


对于可选字段,但您仍想确保数据类型正确,您可以使用request.resource.data.get方法。 有关更多信息,请参阅可选字段的强制类型

例如,如果phone_num字段是可选的,则可以使用以下规则来确保数据类型正确:

match /requests/{doc} {
    allow create: if (request.auth != null) && 
      request.resource.data.user_id is string &&
      request.resource.data.get('phone_num', '') is string;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM