首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用React本机和多对多firebase firestore集合关系来连接数据?

如何使用React本机和多对多firebase firestore集合关系来连接数据?
EN

Stack Overflow用户
提问于 2019-02-20 06:49:18
回答 1查看 0关注 0票数 0

我是新手,我试图了解如何在NoSQL中使用firebase建立多对多的关系模型。

在我的方案中,用户可以拥有多个组,组可以拥有多个用户所有者。

我想显示特定用户的组信息(名称,城市状态)。(在这种情况下,doc id:WQQZ6pcMMgQoTxH9cr2XGaPOq9W2)。

这是firebase文件存储中数据的结构:

代码语言:javascript
复制
{
    "__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__": {}
            }
        }
    }
}

这是我的代码:

代码语言:javascript
复制
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实时数据库
用户,eventAttendees和事件多对多加入firebase实时数据库

用户,eventAttendees和事件多对多加入firebase实时数据库

但是,这使用实时数据库而不是文件存储,这是我想要使用的。

我想做同样的事情但是:用户,用户组和组

数据的结构应该不同吗?

EN

回答 1

Stack Overflow用户

发布于 2019-02-20 16:03:16

您正在回调组的加载console.log(groups) 之外进行打印。这不起作用,因为数据是从Firestore异步加载的,并且您的日志语句在加载任何数据之前运行。

如果您放置一些简单的日志语句,这是最容易看到的:

代码语言:javascript
复制
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打印时数组为空:尚未加载任何组。事实上,如果你记录groupsinsode then()回调,你会看到它一次填充一个文档。

任何需要文档的代码都需要在回调中,或者等待使用promise加载文档。由于您正在等待多个文档,请使用Promise.all()

代码语言:javascript
复制
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);
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100008959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档