Javascript Firestore-从文档中获取特定字段 我需要的是:
我想在Firestore中保存文章或注释及其各自的字段:Javascript Firestore-从文档中获取特定字段 我需要的是:,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,我想在Firestore中保存文章或注释及其各自的字段: 头衔 内容(文本或段落) 创建日期 所有者(与其他人共享该物品) 可以对其进行编辑的人员和人员,如:) 但当我显示文章列表时,我不需要“内容”字段(以节省带宽)。我读过(也许我错了),不可能通过Firestore查询只从文档中获取特定字段 如果从文章中获取特定列(不包含其内容)是正常的SQL,则类似于: SELECT title, creation_date, ... FROM table_name; 因此,我选择将两个根级集合的内
- 头衔
- 内容(文本或段落)
- 创建日期
- 所有者(与其他人共享该物品) 可以对其进行编辑的人员和人员,如:)
SELECT title, creation_date, ...
FROM table_name;
因此,我选择将两个根级集合的内容分开(为了灵活性和可伸缩性)
我目前的结构: 文章集:
- `articles` [collection]
- `ARTICLE_ID` [document]
- `creatorId` [field]
- `title` [field]
- `date` [field]
- `owners` [obj field]
- {user1_id}: true
- {user2_id}: true
...
- `contents` [collection]
- `{ARTICLE_ID}` [document]
- `content` [field]
目录集:
- `articles` [collection]
- `ARTICLE_ID` [document]
- `creatorId` [field]
- `title` [field]
- `date` [field]
- `owners` [obj field]
- {user1_id}: true
- {user2_id}: true
...
- `contents` [collection]
- `{ARTICLE_ID}` [document]
- `content` [field]
要实时获取文章列表,请执行以下操作:
firebase.firestore().collection('articles')
.where(`owners.${user.uid}`, '==', true)
.onSnapshot(querySnapshot => {
const articles = []
querySnapshot.forEach((doc) => {
articles.push({
id: doc.id,
...doc.data()
})
})
// do something with articles array
})
要在另一个视图中显示并获取整篇文章及其内容,请执行以下操作:
const db = firebase.firestore()
const articleRef = db.collection('articles').doc(articleId)
const contentRef = db.collection('contents').doc(articleId) // same Id as article
articleRef.get().then(articleDoc => {
if (articleDoc.exists) {
contentRef.get().then(contentDoc => {
if (contentDoc.exists) {
const article = {
...articleDoc.data(),
...contentDoc.data()
}
// full article obj
}
})
}
})
我的问题
- 您认为最好同时执行两个查询(getArticle和getContent),并使用Promise.all()等待,而不是像我一样嵌套查询
- 有没有更好的方法通过一次查询或更高效地获取文章及其内容?一些提示或想法
提前非常感谢 Firebase主机将是静态内容(如文章)的最佳选择。例如,如果您看一看,它们非常适合极快的页面加载,并突出了边缘缓存的好处。Firebase主机是
Firestore和Firebase实时数据库是数据库引擎。这些都不是提供文章的合适工具。两种方法都不比另一种好。但有几个关键区别
Promise.all()
时,两个读取同时启动,因此可以(部分)并行运行Promise.all()
时,您的完成处理程序(您在then()
中运行的代码)将在两个文档都加载后才会执行。如果嵌套调用,则可以在加载第一个文档后更新UIlet collectionRef = firestore.collection('col');
let documentRef = collectionRef.doc('doc');
return documentRef.set({x:10, y:5}).then(() => {
return collectionRef.where('x', '>', 5).select('y').get();
}).then((res) => {
console.log(`y is ${res.docs[0].get('y')}.`);
});
您当前的代码有什么问题?@FrankvanPuffelen我已经改进了解释。代码工作正常。我对把事情做好只有存在主义的怀疑。喜欢“存在主义的怀疑”的评论brillantIn在UI中,我会显示一个加载图标,直到我从两个查询(文章及其内容)中获得数据为止。因此,我认为最好将它们与Promise.all()并行使用。我将尝试两种方法中的哪一种更快/更有效。谢谢!:)我想这只适用于Google Cloud和Node.js包:PIs有可能有两个或更多字段吗?@harshadnarkhede Yep,用逗号分隔你想要的任何列名列表。界面是
select(…field:| string | FieldPath)[])
,例如:select('field1','field2','other_field','and-a-fourth')
。谢谢!但这不仅仅是针对文章。这是给便条和其他东西的,呵呵:)我明白了。原来的问题变了。希望我能为你节省一些时间。。。说真的,文章应该是静态的,带有一个静态URL。这并不是说一些
内容在主菜上桌后无法加载。对不起,也许我用“文章”这个词让你有点困惑。我称之为私人票据。只有您才能在仪表板中看到您的笔记及其标题和内容(wysiwyg)。稍后我将在其中添加并与其他用户共享它们。不过还是要谢谢你!=)无论是一篇文章还是一篇笔记,在这里都无关紧要:-)