是否可以仅使用一个请求在Firestore中存储多个文档?使用此循环可能但这会导致列表中的每个项目进行一次保存操作.
for (counter in counters) {
val counterDocRef = FirebaseFirestore.getInstance()
.document("users/${auth.currentUser!!.uid}/lists/${listId}/counters/${counter.id}")
val counterData = mapOf(
"name" to counter.name,
"score" to counter.score,
)
counterDocRef.set(counterData)
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试从项目目录中的文件中读取。
我的问题是,根据调用者的不同,路径会发生变化。调用者发生了变化,因为我想对这段代码进行单元测试,而调用者不再是了Main.go。
这就是我的项目结构:
我尝试访问的代码specialChars.txt如下所示:
func RemoveSpecialChars(word string) string {
file, err := ioutil.ReadFile("wordlists/specialChars.txt")
[...]
}
Run Code Online (Sandbox Code Playgroud)
此代码适用于 start fromMain.go但不适用于 start from CleanupUtil_test.go。为了让它在测试中正常工作,我需要file, err := ioutil.ReadFile("../wordlists/specialChars.txt")
我找到了这样的答案: https: //stackoverflow.com/a/32163888/2837489
_, filename, _, ok := runtime.Caller(0),这显然也取决于调用者。
是否可以独立于调用函数获取项目根路径?还是我的代码设计有问题?我应该将文件路径传递给函数吗?
如果允许用户根据用户的电子邮件地址阅读文档中的文档,我想存储.多个用户应该可以访问同一文档.
根据文档, Firestore不允许查询数组成员.这就是为什么我将用户电子邮件地址存储在String-Bool Map中,并将电子邮件地址作为密钥.
对于以下示例,我没有使用电子邮件作为映射键,因为它已经不能使用基本字符串.
数据库结构如下所示:
lists
list_1
id: String
name: String
owner: E-Mail
type: String
shared:
test: true
Run Code Online (Sandbox Code Playgroud)
此处列出了所有安全规则:
service cloud.firestore {
match /databases/{database}/documents {
match /lists/{listId=**} {
allow read: if resource.data.shared.test == true
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:如果我使用match /lists/{listId}而不是,它也不起作用match /lists/{listId=**}
我理解的是,如果地图中的shared[test]值为true ,则此安全规则应允许对每个人进行读取访问.
为了完整起见:这是我正在使用的查询(Android上的Kotlin):
collection.whereEqualTo("shared.test", true).get()
.addOnCompleteListener(activity, { task ->
if (task.isSuccessful) {
Log.i("FIRESTORE", "Query was successful")
} else {
Log.e("FIRESTORE", "Failed to query existing from Firestore. Error ${task.exception}")
}
})
Run Code Online (Sandbox Code Playgroud)
我猜我无法访问安全规则中的地图值.那么什么是我的问题的替代解决方案?
我正在尝试创建一个允许用户在列表上进行协作的应用程序.需要邀请每个用户才能在列表中工作.
我构建了这样的数据(基于这篇博文).如果需要,也可以改变这种结构.
list
list_1:
users:
owner:
owner@company.com: true
shared:
user@company.com: true
user2@company.com: true
id
name
items:
item_1:
id:
name:
...
Run Code Online (Sandbox Code Playgroud)
我想要实现的目标:每个人都应该能够创建列表.然后,他们的创建者将成为创建列表的所有者.只有"共享"文档中的所有者和用户才能读取和写入此列表.
我想权限设置看起来应该是这样的.但这不起作用:
service cloud.firestore {
match /databases/{database}/documents {
match /lists/{listId}/{anything=**} {
allow read, write: if !exists(resource.data.users.owner) ||
resource.data.users.owner == request.auth.token.email ||
request.auth.token.email in resource.data.users.shared
}
}
}
Run Code Online (Sandbox Code Playgroud)