Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 如何查询firestore中的嵌套对象_Firebase_Dart_Nosql_Flutter_Google Cloud Firestore - Fatal编程技术网

Firebase 如何查询firestore中的嵌套对象

Firebase 如何查询firestore中的嵌套对象,firebase,dart,nosql,flutter,google-cloud-firestore,Firebase,Dart,Nosql,Flutter,Google Cloud Firestore,我想以以下格式存储数据: { "chatName": "Football", "chatMembers": [ { "userId": "nSWnbKwL6GW9fqIQKREZENTdVyq2", "name": "Niklas" }, { "userId": "V3QONGrVegQBnnINYHzXtnG1kXu1", "name": "Timo" },

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

{
   "chatName": "Football",
   "chatMembers":
   [
      {
         "userId": "nSWnbKwL6GW9fqIQKREZENTdVyq2",
         "name": "Niklas"
      },
      {
         "userId": "V3QONGrVegQBnnINYHzXtnG1kXu1",
         "name": "Timo"
      },
   ]
} 
我的目标是获取所有聊天,其中具有
userId
的登录用户位于
chatMembers
列表中。如果登录用户的
userId
不在
chatMembers
属性中,则应忽略该聊天。这可能吗

如果这是不可能的,我如何通过子集合实现这一点

我的开发语言是dart,但您也可以用其他语言发布解决方案

我当前的尝试是这样的,但不起作用:

_firestore.collection(collectionName).where("chatMembers.userId", isEqualTo: userId).snapshots()

自2018年8月以来,出现了新的
数组\u contains
运算符,该运算符允许基于数组值进行过滤。文件在这里:

它可以很好地处理字符串数组。但是,我认为不可能查询存储在数组中的对象的特定属性。一种解决方法是查询整个对象,如下所示(在Javascript中)。当然,这并非在所有情况下都可行

    var db = firebase.firestore();
    var query = db.collection('chatDocs').where("chatMembers", "array-contains", { userId: "xyz", userName: "abc" });

雷纳德·塔尔内克(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。

Perfect,就像我搜索的那样,但我不知道如何在dart中使用它。我必须进行反复试验:)。请看它是否有帮助您的firestore模型必须与您查询collections文档属性的方式完全匹配不幸的是:(他们应该会解决这个问题。@Jason如果无法查询整个对象,您可能会复制数据,即在文档中添加一个额外的字段,其中包含您要搜索的值。非常不幸的是,它不支持查询数组中对象内的单个字段。这是唯一的解决方案吗?这违背了查询请注意,OP实际上在数组字段上执行查询。