3

I have a query that searches for a user based on user ID.

usersRef.queryOrderedByChild("email").queryEqualToValue(email).observeEventType(.Value, withBlock: { snapshot in
    if snapshot.exists() {
        print("user exists")
        print(snapshot.key)

The query returns the correct user, but the line print(snapshot.key) literally returns the word "users", and not an actual user ID. print(snapshot) returns the following user:

Snap (users) {
   DELyncz9ZmTtBIKfbNYXtbhUADD2 =     {
       email = "test3@gmail.com";
       "first_name" = test;
       "last_name" = test;
   };

How can I get DELyncz9ZmTtBIKfbNYXtbhUADD2? I can get the email by using let email = child.value["email"] but I can't get the key because it's not a named attribute.

Thanks!!

EDIT: Updated code thanks to Frank's answer. Getting ambiguous use of key

query.observeEventType(.Value, withBlock: { snapshot in
            print(snapshot.key)

            if snapshot.exists() {
                print("user exists")

                for child in snapshot.children {
                    print(child.key)
winston
  • 3,000
  • 11
  • 44
  • 75

1 Answers1

5

When you run a query at a location, the result will be a list of the matching children. Even if there is only a single matching item, the result will be a list of one child.

You're printing the key of all resulting children. Since there is no single result, the SDK prints the key of the location/collection that you queried: users.

What you're likely looking for is to loop over the matching children and print their keys:

let query = usersRef.queryOrderedByChild("email").queryEqualToValue(email)
query.observeEventType(.Value, withBlock: { snapshot in
    for child in snapshot.children {
        print(child.key)
    }
})
Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807