![](/img/trans.png)
[英]Is there a way to add new field to all of the documents in a firestore collection?
[英]Firebase Firestore: Is there a way to enforce required fields for all documents in a collection?
我正在为我正在创建的应用程序手动添加数据。 我必须将许多文档添加到一个集合中,所有这些文档都必须包含相同的 5 个字段。 有没有办法在Firebase控制台新建文档的时候自动创建这些字段? 并且还强制所有文件都有这 5 个字段(这样我就不会犯错误)?
此外,是否有比从 Firebase 控制台手动添加此数据更好的方法? 例如通过JSON?
这里有两个不同的问题。 之前都已经回答过这两个问题,但从来没有在一个问题中回答过,所以我会在这里回答。
这不可能。 您将明确地将这些值写入您创建的每个新文档中。
这可以通过使用 Firebase 的服务器端安全规则来实现。
例如,要确保文档具有field1
、 field2
和field3
,您可以使用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_id
, origin
为 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.