I am getting "ValueError: A document must have an even number of path elements"

Question:

I am trying to read data from excel and store the text data in firestore. When I try to add it one by one without for loop it is working but if I try to automate the process it is not working.

Working Code:

import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore

cred = credentials.Certificate("certificate.json")
firebase_admin.initialize_app(cred)


db=firestore.client()
name = 'Ashwin'
date = '23/10/2022'
roll = 'sampledata'
cert = 'sampledata'

def store_add(name, date,roll,cert):
    data = {'name':name, 'date':date,'roll':roll}
    db.collection('certs').document(cert).set(data)

store_add(name,date,roll,cert)

This is my code (Not Working):

import pandas as pd
import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore

cred = credentials.Certificate("certificate.json")
firebase_admin.initialize_app(cred)


db=firestore.client()
def store_add(name, date,roll,cert):
    data = {'name':name, 'date':date,'roll':roll}
    db.collection('certs').document(cert).set(data)

df = pd.read_excel('data.xlsx')
name_list = list(df['name'])
cert = list(df['cert'])
roll = list(df['roll'])
date="24/10/2022"

for i in range(len(name_list)):
    store_add(name_list[i],date,roll[i],cert[i])
    print("Added:",name_list[i])

I am getting the following error:

Traceback (most recent call last):
  File "e:PSDCCertificate-Generatorbulk.py", line 23, in <module>
    store_add(name_list[i],date,roll[i],cert[i])
  File "e:PSDCCertificate-Generatorbulk.py", line 14, in store_add
    db.collection('certs').document(cert).set(data)
  File "C:UsersashwiAppDataLocalProgramsPythonPython310libsite-packagesgooglecloudfirestore_v1base_collection.py", line 130, in document
    return self._client.document(*child_path)
_init__    super(DocumentReference, self).__init__(*path, **kwargs)
  File "C:UsersashwiAppDataLocalProgramsPythonPython310libsite-packagesgooglecloudfirestore_v1base_document.py", line 60, in __init__    _helpers.verify_path(path, is_collection=False)
  File "C:UsersashwiAppDataLocalProgramsPythonPython310libsite-packagesgooglecloudfirestore_v1_helpers.py", line 150, in verify_path    raise ValueError("A document must have an even number of path elements")
ValueError: A document must have an even number of path elements

Firestore Database Structure (Image)

Asked By: R ASHWIN

||

Answers:

As mentioned in the documentation, document IDs cannot contain a slash but in the provided screenshot there are 3. The value of cert is PSDC/2022/TCS/01 so the final path becomes certs/PSDC/2022/TCS/01 that has 5 segments i.e. a sub-collection. You can either replace the / with some other character like _:

db.collection('certs').document(cert.replace("/", "_")).set(data)

Alternatively, if the slashes are required, you can store the cert ID in a field in document data and use a random document ID.

Answered By: Dharmaraj