2016-04-07 15 views
3

Benim yapısı şöyledir:Nesne, seçili birkaç gömülü nesneyle nasıl geri dönülür? aşağıdaki gibi

{ 
    day: x, 
    events: 
    [ 
     { 
      year: y, 
      info: z 
     } 
    ] 
} 

şimdi ben bir hata döndürür yok ama (yanlış olan) de bir şey gösterir aşağıdaki sorguyu yarattı kadar. Ben _ID göre gruplandırmak gerekir okumak, ama ikinci $ maçı memnun nesnelerle diziyi yeniden nasıl bilmiyorum kadarıyla

db.days.aggregate([ 
{ 
    $match: 
    { 
     $and: 
     [ 
      { 
       'day': 'March_13' 
      }, 
      { 
       'events.year': '1870' 
      }, 
      { 
       'events.info': {$regex: "./French./"} 
      } 
     ] 
    } 
}, 
{ 
    $unwind: {path: "$events"}, 
}, 
{ 
    $match: 
    { 
     'info': { $regex: '.*French.*'} 
    } 
}]) 

.

Lütfen bir göz atın ve belki de ilk sorgunun neden bir grup bloğunda çalışmadığını ve neden önerilmediğini söyler misiniz?

{ 
    "day" : "March_13", 
    "events" : 
     [ 
      { 
       "year" : "1929", 
       "info" : "Peter Breck, American actor (d. 2012)" 
      }, 
      { 
       "year" : "1929", 
       "info" : "Joseph Mascolo, American actor" 
      }, 
      { 
       "year" : "1929", 
       "info" : "Zbigniew Messner, Polish economist and politician, 9th Prime Minister of the Republic of Poland (d. 2014)" 
      }, 
      { 
       "year" : "1929", 
       "info" : "Bunny Yeager, American model and photographer (d. 2014)" 
      } 
     ] 
} 

Ve burada "Amerikan" kelimesi sorgulama başarılı olup olamayacaklarını geçerli::

Bazı örnek veriler burada

{ 
    "day" : "March_13", 
    "events" : 
     [ 
      { 
       "year" : "1929", 
       "info" : "Peter Breck, American actor (d. 2012)" 
      }, 
      { 
       "year" : "1929", 
       "info" : "Joseph Mascolo, American actor" 
      }, 
      { 
       "year" : "1929", 
       "info" : "Bunny Yeager, American model and photographer (d. 2014)" 
      } 
     ] 
} 

Temelde ben alan bilgisi içeriyorsa kontrol etmek istiyorum aranan kelime ve eğer varsa onu dizide tutuyorum.

+0

sen [değiştir] bazı örnek belge ve beklenen sonucu içerecek şekilde, yayını elde istediğini göstermek için Can toplama framewrok ile? – chridam

+0

@chridam Lütfen düzenlemeyi kontrol edin. –

cevap

0

Sen istenilen sonucu elde etmek için yukarıdaki örneğin aşağıdaki toplama boru hattı çalıştırmayı deneyin isterdim: eğer olabilir

db.days.aggregate([ 
    { 
     "$match": { 
      "day" : "March_13", 
      "events.year": "1929", 
      "events.info": /American/ 
     } 
    }, 
    { "$unwind": "$events" }, 
    { 
     "$match": { 
      "day" : "March_13", 
      "events.year": "1929", 
      "events.info": /American/ 
     } 
    }, 
    { 
     "$group": { 
      "_id": "$_id", 
      "day": { "$first": "$day" }, 
      "events": { "$push": "$events" } 
     } 
    } 

]) 

Örnek çıktı

/* 0 */ 
{ 
    "result" : [ 
     { 
      "_id" : ObjectId("5706b38dcc578484faab815f"), 
      "day" : "March_13", 
      "events" : [ 
       { 
        "year" : "1929", 
        "info" : "Peter Breck, American actor (d. 2012)" 
       }, 
       { 
        "year" : "1929", 
        "info" : "Joseph Mascolo, American actor" 
       }, 
       { 
        "year" : "1929", 
        "info" : "Bunny Yeager, American model and photographer (d. 2014)" 
       } 
      ] 
     } 
    ], 
    "ok" : 1 
} 
+0

Bu garip ama sorgu hiçbir şey döndürmez, ancak bir hata döndürmez. –

+0

@PetruDanielTudosiu Maç boru hattında normal ifadeyi nasıl uyguladığınızı kontrol ettiniz mi? – chridam

+0

@chirdam Regex, Amerikan içeren her şeye uyması için *. İlk denemede yanlıştı ama değiştirdikten sonra hala bir şey döndürmedi. –

0

Bu basit olurdu $regex'u $cond operatörüyle veya $filter işleciyle birlikte kullanın. İki seçeneğiniz olduğunu söylemiş olursunuz, birincisi toplama altyapısını kullanmaktır (this answer'da belirtildiği gibi) ve C++ ile kodlanan daha hızlı olacak yerel agregasyon boru hattı operatörleri, $unwind operatörünü kullanmanız gerekir. Büyük dizi ile uğraşıyorsanız, yeniden nomalizasyondan sonra belgelerinizin boyutu 16MB'yi aşabilir, bu durumda toplama sorgusu başarısız olur. Bunun olmasına, kullandığınız yapabilirsiniz döndürür mapReduce

function map() { 
    var events = this.events.filter(function(element) { 
     return (/American/i).test(element.info) && element.year === "1929"; 
     }); 
    emit(this.day, events); 
} 

db.collection.mapReduce(
    map, 
    function(key, value) {}, 
    { out: { inline: 1 } }, 
    { query: { "day": "March_13" } } 
) 

:

{ 
    "results" : [ 
      { 
       "_id" : "March_13", 
       "value" : [ 
        { 
         "year" : "1929", 
         "info" : "Peter Breck, American actor (d. 2012)" 
        }, 
        { 
         "year" : "1929", 
         "info" : "Joseph Mascolo, American actor" 
        }, 
        { 
         "year" : "1929", 
         "info" : "Bunny Yeager, American model and photographer (d. 2014)" 
        } 
       ] 
      } 
    ], 
    "timeMillis" : 27, 
    "counts" : { 
     "input" : 1, 
     "emit" : 1, 
     "reduce" : 0, 
     "output" : 1 
    }, 
    "ok" : 1 
} 
İlgili konular