0
votes

I'm working on a python client program to Cloundant. I'd like to retrieve a doc, not based on "_id",but on my own field. Still, it does not work causing Key Error. Any help to solve this error is highly appreciated!

Here is my code:

from cloudant.client import Cloudant
from cloudant.error import CloudantException
from cloudant.result import Result,ResultByKey
...
client.connect()
databaseName = "mydata1"
myDatabase = client[databaseName]

# As direct access like  'doc = myDatabase[<_id>]'  cannot work for my key, 
# let's check on by one ... 
for document in myDatabase:
#    if document['_id']== "20170928chibikasmall":  <=  if I use _id it's ok
    if document['gokigenField']== 111:

This cause

KeyError :'gokigenField'

In advance, I've created gokigenField index using dashboard, then confirm the result via my postman with REST API

GET https://....bluemix.cloudant.com/mydata1/_index

the result is as follows:

{"total_rows":2,"indexes":[{"ddoc":null,"name":"_all_docs","type":"special","def":{"fields":[{"_id":"asc"}]}},{"ddoc":"_design/f7fb53912eb005771b736422f41c24cd26c7f06a","name":"gokigen-index","type":"text","def":{"default_analyzer":"keyword","default_field":{},"selector":{},"fields":[{"gokigenField":"number"}],"index_array_lengths":true}}]}

Also, I've confirmed I can use this gokigenField as query index nicely on cloudant dashboard as well as POST query .

My newly created "gokigenField" is not included in all the document in DB, as there are automatically created doc ("_design/xxx) without that field. I guess this might cause KeyError, when I call this from my Python client.

I cannot find Cloudant API for checking 'if a specific key exists or not in a document', in the reference.. So, cannot have any idea how to by-pass such docs...

1

1 Answers

1
votes

This is how to index an query data from the Python client. Let's assume we already have the library imported and have a database client in myDatabase.

First of all I created some data:

#create some data
data = { 'name': 'Julia', 'age': 30, 'pets': ['cat', 'dog', 'frog'], 'gokigenField': 'a' }
myDatabase.create_document(data)
data = { 'name': 'Fred', 'age': 30, 'pets': ['dog'], 'gokigenField': 'b' }
myDatabase.create_document(data)
data = { 'name': 'Laura', 'age': 31, 'pets': ['cat'], 'gokigenField': 'c' }
myDatabase.create_document(data)
data = { 'name': 'Emma', 'age': 32, 'pets': ['cat', 'parrot', 'hamster'], 'gokigenField': 'c' }
myDatabase.create_document(data)

We can check the data is there in the Cloudant dashboard or by doing:

# check the data is there
for document in myDatabase:
    print(document)

Next we can opt to index the field gokigenField like so:

# create an index on the field 'gokigenField'
mydb.create_query_index(fields=['gokigenField'])

Then we can query the database:

# do a query
selector = {'gokigenField': {'$eq': 'c'}}
docs = mydb.get_query_result(selector)
for doc in docs:
    print (doc)

which outputs the two matching documents.

The python-cloudant documentation is here.