2009-10-28 14 views

risposta

-5
import couchdb 
import simplejson as json 

resource = couchdb.client.Resource(None, 'http://localhost:5984/dbname/_all_docs') 
params = {"include_docs":True} 
content = json.dumps({"keys":[idstring1, idstring2, ...]}) 
headers = {"Content-Type":"application/json"} 
resource.post(headers=headers, content=content, **params) 
resource.post(headers=headers, content=content, **params)[1]['rows'] 
+3

-1: questa risposta è stata pubblicata nello stesso momento in cui è stata fatta la domanda ed è stata accettata su una risposta più conforme all'API che è stata pubblicata prima che questa soluzione fosse contrassegnata come accettata. –

4

Questa è la strada giusta:

import couchdb 

server = couchdb.Server("http://localhost:5984") 
db = server["dbname"] 
results = db.view("_all_docs", keys=["key1", "key2"]) 
+0

Questo è vero solo se non si controlla in modo preciso i risultati. Il mio metodo ti consente di chiedere chiavi da _all_docs che non esistono e recupererai un segnaposto vuoto per le chiavi inesistenti. Se si tenta di farlo con il metodo, si otterrà un'eccezione durante l'iterazione dei risultati. Perché vorrei fare qualcosa di simile? Join veloci manuali. Hai documenti x e vuoi unirti ai dati di altri documenti. – dnolen

+0

@dnolen: In realtà, non è vero ... c'è un errore nel codice '__repr__' per un risultato di riga, è vero, ma puoi semplicemente fare' [riga per riga in db.view ('_ all_docs', chiavi = ["key1", "key2"]). rows se 'value' nella riga] 'per ottenere le righe esistenti. –

21

Il modo più semplice è quello di passare un include_docs = True arg a Database.view. Ogni riga dei risultati includerà il documento. per esempio.

>>> db = couchdb.Database('http://localhost:5984/test') 
>>> rows = db.view('_all_docs', keys=['docid1', 'docid2', 'missing'], include_docs=True) 
>>> docs = [row.doc for row in rows] 
>>> docs 
[<Document 'docid1'@'...' {}>, <Document 'docid2'@'...' {}>, None] 

Si noti che il documento di una fila sarà None se il documento non esiste.

Questo funziona con qualsiasi vista - basta fornire un elenco di chiavi adatto alla vista.

+0

Purtroppo non penso che funzioni con le visualizzazioni ridotte. – dnolen

+2

Vero, ma i documenti non hanno alcun senso dopo una riduzione comunque. Una riduzione combina elementi da più documenti (le coppie emesse dalla mappa (chiave, valore)) in un singolo risultato. Pertanto, una riga ridotta è composta da molti documenti e l'idea di un documento di una riga ridotta non ha senso. Ovviamente, puoi saltare la riduzione di una vista passando una riduzione = False parola chiave arg e che può essere combinata con include_docs = Vero bene. Ma non è più una riduzione; solo una mappa –