2015-10-21 11 views
8

Vorrei interrogare utilizzando il db di cloudant utilizzando il selettore, ad esempio che viene mostrato di seguito: l'utente desidera avere un prestito in prestito il cui importo supera un numero, come accedere all'array in un selettore di cloudant per trovare un record specificoRichiesta selettore di nubi libere

{ 
     "_id": "65c5e4c917781f7365f4d814f6e1665f", 
     "_rev": "2-73615006996721fef9507c2d1dacd184", 
     "userprofile": { 


    "name": "tom", 
     "age": 30, 
     "employer": "Microsoft" 

     }, 
     "loansBorrowed": [ 
     { 
      "loanamount": 5000, 
      "loandate": "01/01/2001", 
      "repaymentdate": "01/01/2001", 
      "rateofinterest": 5.6, 
      "activeStatus": true, 
      "penalty": { 
      "penalty-amount": 500, 
      "reasonforPenalty": "Exceeded the date by 10 days" 
      } 
     }, 
     { 
      "loanamount": 3000, 
      "loandate": "01/01/2001", 
      "repaymentdate": "01/01/2001", 
      "rateofinterest": 5.6, 
      "activeStatus": true, 
      "penalty": { 
      "penalty-amount": 400, 
      "reasonforPenalty": "Exceeded the date by 10 days" 
      } 
     }, 
     { 
      "loanamount": 2000, 
      "loandate": "01/01/2001", 
      "repaymentdate": "01/01/2001", 
      "rateofinterest": 5.6, 
      "activeStatus": true, 
      "penalty": { 
      "penalty-amount": 500, 
      "reasonforPenalty": "Exceeded the date by 10 days" 
      } 
     } 
     ] 
    } 

risposta

11

Se si utilizza l'indice Cloudant Query (tipo di testo, indice di tutto) di default:

{ 
    "index": {}, 
    "type": "text" 
} 

Poi il seguente selettore query deve lavorare per trovare ad esempio tutti i documenti con un loanamount> 1000:

"loansBorrowed": { "$elemMatch": { "loanamount": { "$gt": 1000 } } } 

non sono sicuro che si può convincere Cloudant query a campi indice annidati solo all'interno di un array è così, se non avete bisogno la flessibilità del "indice di tutto" approccio, probabilmente stai meglio creando un indice di ricerca in cloud che indichi solo i campi specifici di cui hai bisogno.

+0

Grazie, ha funzionato – vinSan

+0

funziona per me ~ grazie. – HamasN

9

Mentre la risposta di Will funziona, volevo farti sapere che hai altre opzioni di indicizzazione con Cloudant Query per la gestione degli array. Questo blog ha i dettagli sui vari compromessi (https://cloudant.com/blog/mango-json-vs-text-indexes/), ma per farla breve, credo che questo potrebbe essere l'opzione migliore indicizzazione per voi:

{ 
    "index": { 
    "fields": [ 
     {"name": "loansBorrowed.[].loanamount", "type": "number"} 
    ] 
    }, 
    "type": "text" 
} 

A differenza di approccio index-tutto di Will, qui si sta solo l'indicizzazione di un campo specifico, e se il campo contiene un array, stai indicizzando anche ogni elemento dell'array. In particolare per gli indici "type": "text" su set di dati di grandi dimensioni, specificare un campo da indicizzare ti farà risparmiare tempo di costruzione dell'indice e spazio di archiviazione. Si noti che gli indici di testo che specifica un campo deve utilizzare il seguente modulo nel "fields": campo: {"name": "fieldname", "type": "boolean,number, or string"}

Allora il corrispondente Cloudant Query "selector": dichiarazione sarebbe questo:

{ 
    "selector": { 
    "loansBorrowed": {"$elemMatch": {"loanamount": {"$gt": 4000}}} 
    }, 
    "fields": [ 
    "_id", 
    "userprofile.name", 
    "loansBorrowed" 
    ] 
} 

inoltre notare che non si dispone di per includere "fields": come parte della tua dichiarazione "selector":, ma ho fatto qui per proiettare solo alcune parti del JSON. Se lo ometti dall'istruzione "selector":, verrà restituito l'intero documento.