在Firestore中,多态文档存储意味着您希望在同一集合中存储具有不同结构的文档。Firestore本身并不直接支持多态数据结构,但可以通过一些设计模式来实现类似的效果。以下是一些常见的方法:
您可以在每个文档中添加一个类型字段,用于标识文档的类型。然后,根据这个类型字段来查询和处理不同类型的文档。
{
"type": "user",
"name": "John Doe",
"email": "john.doe@example.com"
}
{
"type": "product",
"name": "Laptop",
"price": 999.99
}
const db = firebase.firestore();
// 查询所有用户
db.collection('items').where('type', '==', 'user').get().then(snapshot => {
snapshot.forEach(doc => {
console.log(doc.id, ' => ', doc.data());
});
});
// 查询所有产品
db.collection('items').where('type', '==', 'product').get().then(snapshot => {
snapshot.forEach(doc => {
console.log(doc.id, ' => ', doc.data());
});
});
另一种方法是使用子集合来组织不同类型的文档。例如,您可以在每个文档中创建一个子集合来存储特定类型的文档。
{
"id": "user-123",
"name": "John Doe"
}
{
"id": "user-123",
"users": [
{
"name": "John Doe",
"email": "john.doe@example.com"
}
]
}
const db = firebase.firestore();
// 查询用户
db.collection('users').doc('user-123').collection('users').get().then(snapshot => {
snapshot.forEach(doc => {
console.log(doc.id, ' => ', doc.data());
});
});
您还可以使用文档引用来链接不同类型的文档。例如,您可以在一个文档中存储另一个文档的引用。
{
"id": "user-123",
"name": "John Doe"
}
{
"id": "profile-456",
"userId": "user-123",
"bio": "Software Engineer"
}
const db = firebase.firestore();
// 查询用户信息
db.collection('users').doc('user-123').get().then(doc => {
if (doc.exists()) {
const userId = doc.id;
return db.collection('profiles').where('userId', '==', userId).get();
}
}).then(snapshot => {
snapshot.forEach(doc => {
console.log(doc.id, ' => ', doc.data());
});
});
通过以上方法,您可以在Firestore中实现多态文档存储,并根据具体需求选择合适的方法。
领取专属 10元无门槛券
手把手带您无忧上云