2015-10-21 16 views
8

Seçici kullanarak cloudant db kullanarak sorgulamak istiyorum, örneğin aşağıda gösterilmiştir: Kullanıcı, bir sayıyı aşan borçlanma kredisi kullanmak isterse, belirli bir kaydı bulmak için bir cloudant selektörde diziye nasıl erişilir?Cloudant 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" 
      } 
     } 
     ] 
    } 

cevap

11

varsayılanı Cloudant sorgu endeksi (tip metin, indeks herşey) kullanıyorsanız:

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

Sonra şu sorgu seçici örneğin bulmaya çalışmalıdır Bir loanamount> 1000 tüm belgeler: Eğer "her şeyi dizine" esnekliğini gerekmiyorsa

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

Ben, bunu bir dizi içinde tek indeks yuvalanmış alanlara Cloudant Sorgu koaksiyel emin değilim yaklaşım, muhtemelen ihtiyacınız olan belirli alanları endeksleyen bir Cloudant Arama endeksi oluşturmaktan daha iyidir.

+0

Teşekkür ederim, işe yaradı – vinSan

+0

benim için çalışıyor ~ teşekkür ederim. – HamasN

9

Will'in yanıtı çalışırken, dizileri işlemek için Cloudant Query ile başka dizin oluşturma seçeneklerinin olduğunu bildirmek istedim. Bu blog (https://cloudant.com/blog/mango-json-vs-text-indexes/) çeşitli ödünleşmeler ilişkin ayrıntılar yer alır ancak uzun lafın kısası, ben bu sizin için en iyi indeksleme seçenek olabilir düşünüyorum: Will'in endeksi-herşey yaklaşımının aksine

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

, burada sadece Dizine eklediğiniz bir belirli bir alan, ve alan dizisini içeriyorsa, dizideki her öğeyi de dizine ekliyorsunuz. Özellikle büyük veri kümelerindeki "type": "text" dizinleri için, bir alanı dizine ekleyerek dizin oluşturma süresi ve depolama alanı kazandırır. "fields": alanında aşağıdaki formu kullanılmalıdır bir alan belirttiğiniz metin dizinleri Not: Öyleyse {"name": "fieldname", "type": "boolean,number, or string"}

gelen Cloudant Sorgu "selector": deyimi bu olacaktır:

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

sahip olmadığını unutmayın "selector": ifadenizin bir parçası olarak "fields": eklemeye, ancak JSON'un yalnızca belirli bölümlerini yansıtmak için burayı yaptım. "selector": ifadenizden çıkarırsanız, belgenin tamamı iade edilir.