2015-10-21 6 views
8

Ich würde gerne cloudant db using selector verwenden, zum Beispiel, der unten gezeigt wird: Benutzer möchte loanborrowed haben, deren Betrag eine Zahl überschreitet, wie man auf das Array in einem cloudant Selektor zugreifen kann, um einen bestimmten Datensatz zu findenCloudant Selector Query

{ 
     "_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" 
      } 
     } 
     ] 
    } 

Antwort

11

Wenn Sie den Standard Cloudant Abfrage Index (Typ Text, Index alles) verwenden:

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

Dann wird die folgende Abfrage Selektor sollte funktionieren zB finden alle Dokumente mit einem loanamount> 1000:

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

Ich bin nicht sicher, dass Sie Cloudant Query nur Index verschachtelte Felder innerhalb eines Arrays entlocken können so, wenn Sie die Flexibilität des „Index alles“ nicht brauchen Vorgehensweise ist es wahrscheinlich besser, einen Cloudant Search-Index zu erstellen, der nur die von Ihnen benötigten Felder indiziert.

+0

Vielen Dank, es hat funktioniert – vinSan

+0

funktioniert für mich ~ danke. – HamasN

9

Während Wills Antwort funktioniert, möchte ich Sie wissen lassen, dass Sie mit Cloudant Query andere Indizierungsoptionen für den Umgang mit Arrays haben. Dieses Blog Details über verschiedene Vor- und Nachteile hat (https://cloudant.com/blog/mango-json-vs-text-indexes/), aber lange Geschichte kurz, ich denke, das könnte für Sie die beste Indizierung Option:

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

Im Gegensatz zu Wills Index-alles-Ansatz, hier bist du nur die Indizierung eines spezifisches Feld, und wenn das Feld ein Array enthält, indexieren Sie auch alle Elemente im Array. Insbesondere bei "type": "text" Indizes für große Datasets, die ein zu indizierendes Feld angeben, sparen Sie Index-Build-Zeit und Speicherplatz. Beachten Sie, dass Textindizes, die ein Feld angeben müssen Sie das folgende Formular im "fields": Feld verwenden: {"name": "fieldname", "type": "boolean,number, or string"}

So dann die entsprechende Cloudant Abfrage "selector": Aussage wäre dies:

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

Beachten Sie auch, dass Sie nicht haben um "fields": als Teil Ihrer "selector": Anweisung einzuschließen, aber ich habe hier nur bestimmte Teile des JSON projiziert. Wenn Sie es aus Ihrer "selector":-Anweisung weglassen, wird das gesamte Dokument zurückgegeben.