I'm working on an a persistent key-value store in Node right now. It's called Medea, and it's currently 100% JavaScript.
It's pre-1.0 at this time, but I think the API is pretty stable.
Medea (10.000x)
12,324 op/s ⨠ set small
12,313 op/s ⨠ set medium
12,248 op/s ⨠ set large
40,566 op/s ⨠ get large
44,246 op/s ⨠ get medium
45,174 op/s ⨠ get small
levelUP (10.000x)
38,374 op/s ⨠ set small
33,019 op/s ⨠ set medium
23,348 op/s ⨠ set large
30,622 op/s ⨠ get large
36,191 op/s ⨠ get medium
38,326 op/s ⨠ get small
This is using an earlier version of Medea. The "set" numbers for Medea are a lot better now than they were at that time, though I believe levelUP is still doing faster writes.
LevelUP (and LevelDB) have a few differences. In Medea, a range query would have to be built from the calling code. You'd have to filter listKeys() and then iterate over those keys doing a get on each one.
Medea keeps a copy of all keys and value file IDs/offsets in-memory (to make a maximum of 1 disk seek per get), so your key set has to fit in memory.
It's working pretty good for me, and I know at least one other person who is using it for their project.
Medea is pretty stable now, but I expect stability issues to be raised and squelched as we approach 1.0.
That said, levelUP and LevelDB are great projects, and you can't go wrong with those options, either. Medea being all-JavaScript is a pro for me at this time.
Cheers,