I had a hard time installing couchapp (my machine is not connected to the
internet) but finally got that working, and I would say it is worth the
effort. My problem is solved and here is what I did, just in case somebody
out there have the same problem at hand.
1. I used python couchdb module to save into couchDb like this:
from couchdb.mapping import Mapping, DictField, Document, TextField,
FloatField, DateTimeField
class Lightning(Document):
information = DictField(Mapping.build(
attributes = DictField(Mapping.build(
timestamp = DateTimeField();
longitude = FloatField(),
latitude = FloatField(),
description = TextField()
))
))
light = Lightning(timestamp = datetime.now(), longitude = 30.4, latitude =
18.9, description='cloud to ground')
light.store(db)
2. Using couchapp, I did:
couchapp init vaisala
Take note that 'vaisala' is my design document name.
There might be something wrong with my couchapp installation because it did
not create the various sub-directories and so, I manually created the
"lists" directory
3. I then did:
couchapp generate list lightlist
It then created lightlist.js inside the "lists" directory, which I then
added this code:
function(head, req) {
var row = getRow();
var mylist = new Array();
while(row) {
mylist.push(row.value.information);
row=getRow();
}
send(JSON.stringify(mylist, null, 2);
}
Prior to that, I have an existing view called "nv" which is contained on
another design document called "doc". Notice that in my list function, I am
simply building a regular javascript array, and the elements are already in
the right object structure. Recall that my target JSON output is an array
(hence, I am building an array in my list function) of dictionary of
dictionaries. "row.value.information" is actually dictionary of
dictionaries that I see in my "nv" view. At the end of my list function, I
am simply converting the javascript object to JSON format. The "2" in the
argument will provide indentation to the JSON output, making it more
readable, and make it look like more my desired output.
4. I uploaded the list function via "couchapp push lightning". "lightning"
here is the name of my couchDB database. Using Fauxton, I am able to see in
the "lightning" database, an entry with id of "_design/vaisala", and under
that, "lists", I can see "lightlist" containing the function that I just
created.
5. I then type:
curl -X GET
http://172.16.54.8:5984/lightning/_design/vaisala/_list/lightlist/doc/nv
And that showed that data in the format that I want it.
Thanks to everyone who helped me figure it out especially to Aurélien, who
had been very patient with me!
On Thu, May 4, 2017 at 11:23 PM, Aurélien Bénel <[email protected]>
wrote:
> Hi Noel,
>
> > "error":"compilation_error","reason":"Expression does not eval to a
> function.
>
>
> We could analyse the JSON manually, but as your application will get
> bigger,
> it will become more and more complex.
> As I wrote earlier, I recommend you to use a tool like couchapp (
> http://github.com/couchapp/couchapp).
>
> The idea is to convert a folder with subfolders and files into a design
> document.
> In your case it would be something like:
>
> - doc / (weird name for a design document…)
> - views
> - map
> - nv.js
> - lists
> - lightning.js
>
> Documentation is there:
> https://couchapp.readthedocs.io/en/latest/couchapp/gettingstarted.html
>
> Note that, with couchapp, you are not obliged to generate a complete « app
> », but maybe it’s easier to begin with.
>
>
> Regards,
>
> Aurélien
--
Noel P. Quintos