我想以以下格式存储数据:
<?php
session_start();
ob_start();
If (!isset($_SESSION["username"]['status'])){
$_SESSION['username'] = $username;
$_SESSION['status'] = 'admin';
header("Location:logreg.php");
}
else {
$username = $_SESSION['username'];
}
?
我的目标是获取所有聊天记录,其中带有{
"chatName": "Football",
"chatMembers":
[
{
"userId": "nSWnbKwL6GW9fqIQKREZENTdVyq2",
"name": "Niklas"
},
{
"userId": "V3QONGrVegQBnnINYHzXtnG1kXu1",
"name": "Timo"
},
]
}
的登录用户位于userId
列表中。如果已登录用户的chatMembers
不在userId
属性中,则应忽略该聊天。这可能吗?
如果这不可能,那么我该如何通过子集合来实现呢?
我的开发语言是dart,但是您也可以发布其他语言的解决方案。
我当前的尝试是这样,但这不起作用:
chatMembers
答案 0 :(得分:5)
自2018年8月以来,新的array_contains
运算符允许根据数组值进行过滤。该文档位于此处:https://firebase.google.com/docs/firestore/query-data/queries#array_membership
它与字符串数组一起很好地工作。但是,我认为不可能查询存储在数组中的对象的特定属性。一种解决方法是查询整个对象,如下所示(使用Javascript)。当然,可能并非在每种情况下都可行。...
var db = firebase.firestore();
var query = db.collection('chatDocs').where("chatMembers", "array-contains", { userId: "xyz", userName: "abc" });
答案 1 :(得分:5)
已完成的Renaud Tarnec并非在每种情况下都有效。只知道一个字段或不知道所有字段的情况不会返回预期的文档。但是,通过重组文档中的数据,可以使查询在只有一个字段(例如用户标识符(uid))已知的情况下工作。
这是其中一个文档中的数据结构:
{
"members": {
"user4": {
"active": true,
"userName": "King Edward III",
"avatar": "www.photos.gov/animeGirl5.png"
},
"user7": {
"active": true,
"userName": "Dave K.",
"avatar": "www.photos.gov/gunsAmericanFlag.png"
}
}
以下是查询:
uid = 'user4';
collectionQuery = collectionReference.where(`members.${uid}.active`,"==", true);
在此示例中,“ user4”表示可能或可能不在组中的用户。这将返回uid“ user4”是活动成员的集合中的所有文档。这只需要知道成员的UID即可起作用,而无需提前知道其名称或头像uri即可起作用。