2016-04-13 19 views
-1

İlginç bir sorum var. Örneğin, start_date ve end_date ile bir mongo koleksiyonum var. Çakışan tarihlere sahip bir dizi diziyi döndürecek bir toplama sorgusu (veya mapReduce) oluşturmam gerekiyor. ÖrneğinMongo toplama sorgusu

:

toplama:

[{ 
    _id: 1111111, 
    start_date: '10/04/2016', 
    end_data: '13/04/2016' 
}, 
{ 
    _id: 2222222, 
    start_date: '11/04/2016', 
    end_data: '20/04/2016' 
}, 
{ 
    _id: 3333333, 
    start_date: '10/05/2016', 
    end_data: '13/05/2016' 
}, 
{ 
    _id: 44444444, 
    start_date: '12/05/2016', 
    end_data: '15/05/2016' 
}, 
{ 
    _id: 55555555, 
    start_date: '18/04/2016', 
    end_data: '22/04/2016' 
}] 

,

[[1111111, 2222222], [3333333,44444444], [2222222, 55555555]] 
+0

Çakışan 2'den fazla belgeniz varsa ne olur? – VonD

+1

Hayır, bunu birleştirme ile yapamazsınız, bunu uygulamada yapmanız gerekir. – BanksySan

+0

İmkansız? nahhh ... Ne dersiniz: proje (bir dizide 2 tarihin koyulması)> O dizide gevşeyiniz> Tarihe göre gruplandır> bir tarih başlıyorsa diğeriyle eşleşir> addToSet thesw gruplandırılmış kimlikleri ...... Küresel fikir, tam kodu vermeyi deneyeceğim. –

cevap

0

Böyle bir şey yapacağını düşünmek dönmelidir doğrulamak için gerçek veriler ile denemek gerekir.

Bunu genel bir fikir olarak gönderiyorum, lütfen daha net bir şeyiniz varsa, lütfen cevabı doğrulayın ve düzeltin.

db.collection.aggregate([ 
{$project: { 
     _id:$_id, 
     dates: [{no:1, date:$start_date},{no:2,date:$end_date}] 
}}, 
{$unwind: $dates}, 
{$group: _id: $dates.date , 
     start_dates: {$addToSet: {$cond:{if:{$eq:[1, $dates.no]}, 
      then: [$_id], 
      else: null}}}, 
     end_dates: {$addToSet: {$cond:{if:{$eq:[2, $dates.no]}, 
      then: $_id, 
      else: null}}} 
}, 
{$match: {$start_dates.1:{$exists:true}, 
     $end_dates.1{$exists:true}}} 
]), //At this point you have objects like { aDate, [lst of ids with that date as start], [lst of ids with that date as end]} 
{$unwind: $start_dates}, 
{$group: {_id: {date:$_id, id:$start_dates.1}, // You still have 1 array of array per dates, you can always put "_id: 1" to have only 1 array as answer 
     res: {$addToSet:{$start_dates: {$each: $end_dates}}}} 
}