在深层嵌套对象中查找匹配的属性值:firestore v9 和 javascript

问题描述 投票:0回答:1

我有一个像这样的Firestore文档数据:

UsersData: {
  a1234sdffsdf: {
    avatarUrl: 'xxxxxx',
    id: 'qwe234234',
    name: 'larry',
    status: 'online'
  },
  u1ty4sdff09k: {
    avatarUrl: 'xxxxxx',
    id: 'abc123456',
    name: 'stephen',
    status: 'online'
  }
}

我想循环遍历两个对象(

a1234sdffsdf
u1ty4sdff09k
)以找到与用户id匹配的
id
属性并将状态更新为
'offline'
。如何使用 firebase v9 实现此功能?

collection: chatrooms
document: randomid
data: UsersData

const chatroomQuery = query(collection(db, 'chatrooms', where(loop through UsersData and find id, '==', user.id)
updateDoc(chatroomQuery, { status: 'offline' }) 

有人可以帮我吗?非常感谢您的帮助🙏

javascript reactjs firebase
1个回答
0
投票

确实没有办法按照您所布置的方式进行查询。您正在尝试查询“具有字段

UserData.${some_id}
的文档”。但 Firestore 查询是关于字段中的值,而不是关于字段的存在。

一种选择是在每个文档中创建一个单独的字段,仅包含该文档中的用户 ID(我们称之为

userIds
)并针对该字段进行查询。

因此文档可能如下所示:

{
  UsersData: {
    a1234sdffsdf: {
      avatarUrl: 'xxxxxx',
      id: 'qwe234234',
      name: 'larry',
      status: 'online'
    },
    u1ty4sdff09k: {
      avatarUrl: 'xxxxxx',
      id: 'abc123456',
      name: 'stephen',
      status: 'online'
    }
  },
  userIds: ['a1234sdffsdf', 'u1ty4sdff09k']
}

然后查询将是:

const chatroomQuery = query(collection(db, 'chatrooms',
                            where('userIds', 'array-contains', user.id))

const chatroomSnap = await getDocs(chatroomQuery);
if (chatroomSnap.size === 1) {
  const chatroomRef = chatroomSnap.docs[0].ref;
  await updateDoc(chatroomRef, ........);
} else if (chatroomSnap.size > 1) {
  console.log("Got more than one chatroom....now what?");
} else {
  console.log("no chat rooms found");
}

您可能还想重新考虑

UserData
的数据结构。就具有可变键名称而言,使用起来有点尴尬……这在技术上是可行的,但会导致一些不太简单的编码。

阅读一些有关设计 Firestore 集合和文档的文章可能会让您受益匪浅,例如这个

注意:您的原始代码未正确将 DocumentReference 传递给

updateDoc()
。您向它传递了一个查询,这是行不通的。

© www.soinside.com 2019 - 2024. All rights reserved.