我是新手,我试图了解如何在NoSQL中使用firebase建立多对多的关系模型。
在我的方案中,用户可以拥有多个组,组可以拥有多个用户所有者。
我想显示特定用户的组信息(名称,城市状态)。(在这种情况下,doc id:WQQZ6pcMMgQoTxH9cr2XGaPOq9W2)。
这是firebase文件存储中数据的结构:
{
"__collections__": {
"Group": {
"group3": {
"city": "Aurora",
"state": "CO",
"name": "Group Three",
"__collections__": {}
},
"group4": {
"state": "CO",
"name": "Group Four",
"city": "Denver",
"__collections__": {}
},
"group5": {
"city": "Aurora",
"state": "CO",
"name": "Group Five",
"__collections__": {}
}
},
"User": {
"Hm56Zhn9TJP9jVYrzJRqHAB8T8H3": {
"last_name": "Sneed",
"first_name": "Sam",
"__collections__": {}
},
"WQQZ6pcMMgQoTxH9cr2XGaPOq9W2": {
"last_name": "Smith",
"first_name": "Will",
"__collections__": {}
}
},
"UserGroups": {
"F4GubhZKqWcJnHahL0TQTOP62Jj1": {
"group3": true,
"group4": true,
"__collections__": {}
},
"WQQZ6pcMMgQoTxH9cr2XGaPOq9W2": {
"group5": true
"__collections__": {}
}
}
}
}
这是我的代码:
export default class GroupSelect extends Component {
constructor(props) {
super(props);
this.userGroupRef = firebase.firestore().collection("UserGroups").doc('WQQZ6pcMMgQoTxH9cr2XGaPOq9W2');
this.state = {
userGroups: [
{
uid: 'group1',
name: 'Group One',
city: 'Chicago',
state: 'IL'
},
{
uid: 'group2',
name: 'Group Two',
city: 'Denver',
state: 'CO'
}
]
}
}
componentDidMount() {
this.userGroupRef.get().then((doc) => {
var obj = doc._data;
var group_ids = Object.keys(obj).map(function (key) {
return key;
});
var groups = [];
var group = {};
group_ids.forEach(function (group_id) {
console.log(group_id);
this.groupRef = firebase.firestore().collection('Group').doc(group_id);
this.groupRef.get().then((groupDoc) => {
group.name = groupDoc._data['name'];
group.city = groupDoc._data['city'];
group.state = groupDoc._data['state'];
groups.push(group);
});
});
console.log(groups); //not populated correctly
// this.setState({
// userGroups: groups
// });
});
}
render() {
return (
this.state.userGroups.map((userGroup, index) => (
<Text>{userGroup.name} - {userGroup.city}, {userGroup.state}</Text>
))
)
}
}
如果我在ComponentDidMount()中注释掉所有内容,则render()会正确显示state.UserGroups的原始内容。但是,当我尝试在ComponentDidMount()中填充数组并重置状态userGroups var时,连接和数组填充的时间存在问题。
怎么做到最好?
用户,eventAttendees和事件多对多加入firebase实时数据库
但是,这使用实时数据库而不是文件存储,这是我想要使用的。
我想做同样的事情但是:用户,用户组和组
数据的结构应该不同吗?
发布于 2019-02-20 16:03:16
您正在回调组的加载console.log(groups)
之外进行打印。这不起作用,因为数据是从Firestore异步加载的,并且您的日志语句在加载任何数据之前运行。
如果您放置一些简单的日志语句,这是最容易看到的:
console.log("Start loading documents");
group_ids.forEach(function (group_id) {
this.groupRef = firebase.firestore().collection('Group').doc(group_id);
this.groupRef.get().then((groupDoc) => {
console.log("Loaded document");
});
});
console.log("Started loading documents");
运行此代码时,它输出:
开始加载文件 开始加载文件 加载文件 加载文件 ...
这可能不是您所期望的顺序,但它完美地解释了为什么groups
打印时数组为空:尚未加载任何组。事实上,如果你记录groups
insode then()
回调,你会看到它一次填充一个文档。
任何需要文档的代码都需要在回调中,或者等待使用promise加载文档。由于您正在等待多个文档,请使用Promise.all()
:
var promises = [];
group_ids.forEach(function (group_id) {
promises.push(firebase.firestore().collection('Group').doc(group_id).get())
});
Promise.all(promises).then(function(docs) {
docs.forEach((groupDoc) => {
group.name = groupDoc._data['name'];
group.city = groupDoc._data['city'];
group.state = groupDoc._data['state'];
groups.push(group);
});
console.log(groups);
});
https://stackoverflow.com/questions/-100008959
复制相似问题