2011-06-17 18 views
12

iki belge "Katıl") ve hem DataKey hem de Doc bilgisini al.CouchDB ben biraz bu yüzden benziyor iki belgeleri

girişimim:

Ben ilk Doc içine DataKey gömme çalıştı ve bir harita işlevi şöyle kullandı:

function (doc) 
{ 
    if (doc.type == "Doc") 
    { 
    var ids = []; 
    for (var i in doc.keys) 
     ids.push(doc.keys[i]._id); 

    emit(ids, doc); 
    } 
} 

Ama iki sorunlarla karşılaştı:

  1. Startkey = [idhere ...] kullanarak ve endkey = [idhere ..., {}], Doc başına birden fazla DataKey olabilir.çalışması (yalnızca anahtarın, dizideki ilk örnek olmak için olmasını sağlaması durumunda çalıştı).
  2. Tüm veri anahtarlarının benzersiz olması gerekir ve anahtarı rezerve etmek için {_id = datakey} gibi ayrı bir belge yapmamayı tercih ederim.

Bunu nasıl başarabileceğime dair fikirleri olan var mı? Bir şey açık değilse bana bildirin.

----- DÜZENLEME ----- O benim uygulamada Doc kimliğidir bilmiyorum söylemeyi unutmuşum, bu yüzden DataKey en arama yapmak gerekiyor

İD.

cevap

11

Ben ne istediğini Şimdi

function (doc) 
{ 
    if (doc.type == "Doc") 
    { 
    emit([doc._id, 0], doc); 
    } 

    if(doc.type == "DataKey") 
    { 
    emit([doc.data_id, 1], doc); 
    } 
} 

olduğunu düşünüyorum, key=["AAA"] görünümüyle sorgulamak ve tüm dokümanlar bir listesini göreceksiniz. Birincisi gerçek "Doc" belgesi olacak. Geri kalanlar ilk dokümana referans veren "DataKey" belgeleri olacak.

Bu, CouchDB view collation adı verilen yaygın bir tekniktir.

+0

Bu, bunları birlikte gruplandırır, ancak uygulamanızda, Doc kimliğinin ne olduğunu bilmediğimi belirtmeyi unuttum. Bu yüzden DataKey kimliğini arayabilmem gerekiyor. – Obto

+0

İki sorgulama yapmaktan ne haber? Önce Doc kimliğini DataKey belgesinden alırsınız. Ardından, Doküman Kimliği ile sorgulayabilirsiniz. –

+0

Doğru, doc kimliğini bilmek çok yararlıdır, en kolay şey sadece onları sorgulamak ve almak için olabilir. – JasonSmith

İlgili konular