如何在Firestore中查询嵌套对象

时间:2018-10-20 12:50:41

标签: firebase dart nosql flutter google-cloud-firestore

我想以以下格式存储数据:

    <?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

2 个答案:

答案 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即可起作用。