首页 > 解决方案 > 如何在firestore中查询嵌套对象

问题描述

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

{
   "chatName": "Football",
   "chatMembers":
   [
      {
         "userId": "nSWnbKwL6GW9fqIQKREZENTdVyq2",
         "name": "Niklas"
      },
      {
         "userId": "V3QONGrVegQBnnINYHzXtnG1kXu1",
         "name": "Timo"
      },
   ]
} 

我的目标是获取所有聊天,其中带有 a 的登录用户userIdchatMembers列表中。如果已userId登录用户的 不在chatMembers属性中,则应忽略该聊天。这可能吗?

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

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

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

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

标签: firebasedartnosqlfluttergoogle-cloud-firestore

解决方案


自 2018 年 8 月以来,新的array_contains运算符允许基于数组值进行过滤。文档在这里:https ://firebase.google.com/docs/firestore/query-data/queries#array_membership

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

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

推荐阅读