我构建了一个集合并按顺序添加了一些文档(相隔几秒钟)。 firestore自动生成每个doc.id。
在文档中,它说每个doc.id密钥由一个时间戳部分和随机部分组成(可能是为了确保没有密钥冲突)。
编辑:我在一篇不相关的博客文章中读过这篇文章,所以我删除了它以避免混淆。
由于如果密钥包含一些(隐藏)年表,是否可以根据此密钥执行firestore查询,从而按升序或降序按时间顺序获取结果集?
答案 0 :(得分:3)
不幸的是,Cloud Firestore自动生成的ID不提供任何自动排序,并且不能依赖于按时间顺序排列。要按时间顺序订购文档,您应该将自己的时间戳字段添加到文档中。
来自Firestore add a document documentation:
重要:与Firebase实时数据库中的“推送ID”不同,Cloud Firestore自动生成的ID不提供任何自动排序。如果您希望能够按创建日期订购文档,则应将时间戳存储为文档中的字段。
答案 1 :(得分:0)
使用此firebase函数可以将缺少的“ createdAt”字段添加到firestore上的所有用户文档中。它一次可以修复450个文档(对500个文档有严格限制),并返回其ID列表。
const admin = require('firebase-admin');
admin.initializeApp(/*.....*/);
let db = admin.firestore();
exports.fixUserBase = functions.https.onCall((data, context) => {
let usersRef = db.collection('users');
const batch = db.batch();
let newCount = 0;
var changed = [];
return usersRef.get().then(snapshot => {
if (snapshot.empty) {
console.log('No matching documents.');
return [];
}
else {
console.log('Received ' + snapshot.length + 'user documents.');
}
snapshot.forEach(docDataOrg => {
if (newCount>450){
if (newCount==451) console.log('Stoping at 450');
newCount += 1;
} else {
var docData = docDataOrg.data();
var userID = docDataOrg.id;
var createdAt = docDataOrg["createTime"];
if (!(docData["createdAt"]!=null)){
console.log('updateing createdAt for ' + docData["email"]);
batch.update(usersRef.doc(userID), {"createdAt":createdAt.seconds})
//I prefer seconds to timestamp, remove the '.seconds' if you prefer otherwise
newCount += 1;
changed.push(userID);
}
}
});
console.log('returning ' + changed);
return batch.commit().then(function(){
return changed;
});
});
});
这段代码可以为我节省一些时间,很高兴与大家分享。