Search code examples
reactjsmongodbmongodb-atlasmongodb-stitchmongodb-cluster

Handling Users with MongoDB Stitch App within Atlas Cluster


I have an MongoDB Stitch app, that users the Email/Password authentication. This creates users within the Stitch App that I can authenticate on the page. I also have an MongoDB Atlas Cluster for my database. In the cluster I have a DB with the name of the project, then a collection underneath that for 'Matches'. So when I insert the 'Matches' into the collection, I can send the authenticated user id from Stitch, so that I have a way to query all Matches for a particular User. But how can I add additional values to the 'User' collection in stitch? That user section is sort of prepackaged in Stitch with whatever authentication type you choose (email/password). But for my app I want to be able to store something like a 'MatchesWon' or 'GamePreference' field on the 'User' collection.

Should I create a collection for 'Users' the same way I did for 'Matches' in my Cluster and just insert the user id that is supplied from Stitch and handle the fields in that collection? Seems like I would be duplicating the User data, but I'm not sure I understand another way to do it. Still learning, I appreciate any feedback/advice.


Solution

  • There isn't currently a way to store your own data on the internal user objects. Instead, you can use authentication triggers to manage users. The following snippet is taken from these docs.

    exports = function(authEvent){
       // Only run if this event is for a newly created user.
       if (authEvent.operationType !== "CREATE") { return }
    
       // Get the internal `user` document
       const { user } = authEvent;
    
       const users = context.services.get("mongodb-atlas")
           .db("myApplication")
           .collection("users");
    
       const isLinkedUser = user.identities.length > 1;
    
       if (isLinkedUser) {
            const { identities } = user;
            return users.updateOne(
                { id: user.id },
                { $set: { identities } }
            )
    
        } else {
            return users.insertOne({ _id: user.id, ...user })
                 .catch(console.error)
        }
    };