如何在firestore中查询嵌套对象[重复]

Posted

技术标签:

【中文标题】如何在firestore中查询嵌套对象[重复]【英文标题】:How to query nested objects in firestore [duplicate] 【发布时间】:2019-03-25 03:22:51 【问题描述】:

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


   "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()

【问题讨论】:

【参考方案1】:

自 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" );

【讨论】:

完美,我正在寻找类似的东西,但我不知道如何在飞镖中使用它。我必须反复试验:)。 见***.com/questions/51924896/… 可能有帮助 不幸的是,您的 Firestore 模型必须与您查询集合文档属性的方式完全匹配:( 他们应该解决这个问题。 @Jason 如果您无法查询整个对象,您可能会重复数据,即在文档中添加一个包含您要搜索的值的额外字段。 很遗憾它不支持查询数组内对象中的单个字段。【参考方案2】:

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。

【讨论】:

这是唯一的解决方案吗? 这违背了查询的目的 请注意,OP 实际上是对 Array 字段执行查询。 你没看错,OP 确实查询了 Array 字段,但是 OP 有一个数据结构,其中它们在数组嵌套映射中确实有一个唯一键,如果它们重组为映射-嵌套映射,其中第一级映射键是他们已经拥有的唯一键,然后他们拥有他们实际想要的东西,而不是他们问题的答案。所以我认为这个答案仍然很好,它帮助我思考了这个问题(我现在就有这个问题!),而接受的答案显然确实回答了字面问题。干杯

以上是关于如何在firestore中查询嵌套对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Vue Firestore 查询。 Firestore更新数据时如何避免重复?

来自多个引用的 Firestore 连接数据 [重复]

Firestore - 嵌套查询

如何在android Firestore上实现Paginate查询[重复]

如何在 Swift 中重构重复的 Firestore 文档 ID?

在嵌套对象中使用firestore的FieldPath.documentId()