2016-03-22 7 views
0

cat1 ve cat2 kaynağından tam olarak aynı e-postaya sahip belgeleri döndürmek için bir mongo sorgusu yazmaya çalışıyorum.Alt belge dizisi ortak veriler içerdiğinde belgeleri döndürmek için Mongo sorgusu

Lütfen

Lütfen yardım edin. Bu kaynak cat1 ve CAT2 hem ortak bir e-posta adresi [email protected] sahip belgedir çünkü

Numune Toplama

{ 
     "id" : "1", 
     "name" : "John", 
     "contacts" : [ 
       { 
         "type" : "email", 
         "source": "cat1", 
      "detail": [email protected] 
       }, 
       { 
         "type" : "email", 
         "source": "cat1", 
      "detail": [email protected] 
       }, 
       { 
         "type" : "email", 
         "source": "cat2", 
      "detail": [email protected] 
       } 
     ] 
}, 
{ 
     "id" : "2", 
     "name" : "Bell", 
     "contacts" : [ 
       { 
         "type" : "email", 
         "source": "cat1", 
      "detail": [email protected] 
       }, 
       { 
         "type" : "email", 
         "source": "cat2", 
      "detail": [email protected] 
       } 
     ] 
}, 

{ 
     "id" : "3", 
     "name" : "Sam", 
     "contacts" : [ 
       { 
         "type" : "email", 
         "source": "cat1", 
      "detail": [email protected] 
       }, 
       { 
         "type" : "email", 
         "source": "cat3", 
      "detail": [email protected] 
       } 
     ] 
} 

Beklenen sonuç takip ediyor beklenen eşleştirme belgeyle bir örnek toplama şema dahil ediyorum .

Her ikisi de cat1 ve cat2 kaynağından gelen e-postaya sahip olmaları nedeniyle e-posta adreslerinin farklı olması nedeniyle, kimliği 2 olan bir belge iade edilmemelidir.

3 numaralı belge, e-posta adreslerinin aynı olması nedeniyle kategorilerinin cat1 ve cat2 olmadığı için döndürülmemelidir.

{ 
     "id" : "1", 
     "name" : "John", 
     "contacts" : [ 
       { 
         "type" : "email", 
         "source": "cat1", 
      "detail": [email protected] 
       }, 
       { 
         "type" : "email", 
         "source": "cat1", 
      "detail": [email protected] 
       }, 
       { 
         "type" : "email", 
         "source": "cat2", 
      "detail": [email protected] 
       } 
     ] 
} 
+0

Ne demek istiyorsun? Her iki belgede aynı "kedi" kaynağına sahip diziler var, o zaman neden sadece bir belge geri dönecek? Bu ikisinin "kesişme" sini temsil etmek mi? Sadece kesişen tek eleman değil, sadece ** "cat1" verileri olabilir mi? Tüm "kavşakları" koleksiyondan mı bekliyorsunuz? Yoksa sadece ilk belgeyle "kavşaklar" ile ilgileniyor musunuz? StackOverflow'a hoş geldiniz. Akranlarınızın sorularını sorduğunuzda bundan daha açık olmalısınız. –

+0

Soru başlığınız, soru içeriğinizle farklı görünüyor. Soru içeriğinizi karşılamak için, '> db.collection.find ({$ ve: [{'contacts.source': 'cat1'}, {'contacts.source': 'cat2'}}}})' aracılığıyla ve operatör. – zangw

+0

@zangw bu, cat1 ve cat2 e-posta adreslerinin her ikisinin de aynı e-posta adresiyle karşılaştırılamamıştır. – Raki

cevap

0

Lütfen aynı e-postayı cat1 ve cat2'den filtrelemek için düz JavaScript kodlarını kullanmayı deneyin.

> db.collection.find().forEach(function(doc) { 
     var cat1Email = new Set(); 
     var cat2Email = new Set(); 

     doc.contacts.forEach(function(c){ 
      if (c.source === 'cat1'){ 
       // save the cat1 emails 
       cat1Email.add(c.detail); 
       if (cat2Email.has(c.detail)){ 
        // if there is same email from cat2, print this document 
        return printjson(doc); 
       } 
      }else if(c.source === 'cat2'){ 
       // save cat2 email 
       cat2Email.add(c.detail); 
       if (cat1Email.has(c.detail)){ 
        // if there is same email from cat1, print this document 
        return printjson(doc) 
       } 
      } 
     }); 
    }) 
+0

Teşekkürler dostum. Aslında .NET seviyesinde kullanmak açısından biraz daha sağlam olacak bir çözüme ulaşmaya çalışıyorum. Mongo'yla oldukça yeniim, ancak bunu başarmak için toplama çerçevesini kullanmam gerekip gerekmediğini düşünüyordum. – Raki

+0

@Raki, bunu birleştirme yoluyla çözmeye çalışıyorum, ancak başarısız oldum. Umarım birileri toplanma yoluyla işaret eder. – zangw

İlgili konular