javascript - 如何从firestore中的文档ID数组中获取所有子集合文档
问题描述
我正在构建 javascript 服务,我想从"collection name"和"document-id arrays"的输入中获取来自 firestore 的所有子集合文档详细信息。
请求有效负载调用我的服务:
{
root_collection_name: "root_collection",
"msgId": ['11','22','33','66'],
"subcollection_name": "message"
}
我需要搜索所有这些msgId 的所有子集合(所有文档的通用名称)文档。
我的 Firestore 结构如下所示
collection:
document1:
subcollection:
document:
"val1":"red",
"val2":"blue",
"val3":"green"
document2:
subcollection:
document:
"val1":"apple",
"val2":"mango",
"val3":"grape"
document3:
..............
................
例子:
root_collection:
11:
aaa:
message:
"val1":"red",
"val2":"blue",
"val3":"green"
22:
bbb:
message:
"val1":"apple",
"val2":"mango",
"val3":"grape"
在这种情况下,我需要获取msgId "11"、"22"的数据,这些数据在 firestore 中可用,其他值应该发送 null。你能帮我解决这个问题吗,不确定我在这里想念的地方。
这是我为此编写的代码。
const input = {
"root_collection_name": "root_collection",
"msgId": ['11','22','33','66'],
"subcollection_name": "message"
}
const test = (input) => {
const query = firestore.collection(input.root_collection_name).where('id', 'array-contains-any', input.msgId);
query.get().then((querySnapshot) => {
querySnapshot.forEach((document) => {
document.ref.collection(input.subcollection_name).get().then((querySnapshot) => {
querySnapshot.forEach(doc => {
console.log('doc data',doc.data());
});
});
});
});
};
test(input);
解决方案
如果您将顶级文档的 ID 添加到子集合文档中,则可以使用 collectionGroup。
因此,从您的示例中,您将拥有:
root_collection:
11:
aaa:
message:
"root_id": "11", // <<-- new!
"val1":"red",
"val2":"blue",
"val3":"green"
22:
bbb:
message:
"root_id": "22", // <<-- new!
"val1":"apple",
"val2":"mango",
"val3":"grape"
你可以查询:
var msgs = firebase.firestore().collectionGroup('message')
.where('root_id', 'in', ['11','22']);
注意:这将查询任何和所有名为的子集合message
。当您向模型添加较新的子集合时,如果它们不是同一类型的“消息”,您可能会选择不同的名称。
推荐阅读
- python - Python (2.7) - 考虑多个字段的简单 IF THEN 逻辑
- javascript - 将对象从数组 A 移动到数组 B. Ramda.js
- sql - 计算不同表中的行数并按特定条件分组
- html - 尽管没有填充,但 Div 空间
- python - 如何使用 Python 将新列附加到 csv?
- javascript - 追加来自多个表单的数据以将所有记录存储在 json 中
- shell - Shell Scripting - 列出目录中文件的标题行
- xpath - 计算包含两组 1 且由 0 分隔的列表中 1 的数量
- sql - 从具有两个父级的子表中删除,而无需在 sql server 中进行级联删除
- http - 如何处理通过 HTTP 上传的大文件而不将请求存储在临时文件中