2014-10-30 43 views
1

我有一個集合中的MongoDB這樣的格式:同場錯誤

"_id" : ObjectId("542d5256372943d9e000fc42"), 
    "_class" : "com.bedas.ays.mongo.dto.AboneAriza", 
    "AdSoyad" : "AKIN COBAN", 
    "aimid" : 100009, 
    "CepTelefon" : "5332234401", 
    "Telefon" : "0", 
    "fiderid" : 101383, 
    "kofrano" : NumberLong(444454), 
    "tcNo" : "26402622688", 
    "tmno" : { 
     "trafoNo" : 21649, 
     "trafoname" : "21450 BÜYÜKŞEHİR FİDERİ-->21646 BEYKOP 2.BÖLGE" 
    }, 
    "ilce" : { 
     "ilceUavt" : 2051, 
     "ilcename" : "BEYLİKDÜZÜ" 
    }, 
    "mahalle" : { 
     "mahalleUavt" : 40875, 
     "mahname" : "BARIŞ" 
    }, 
    "sokak" : { 
     "_id" : 716802, 
     "name" : "EGEMENLİK CAD." 
    }, 
    "bina" : { 
     "_id" : 15600414, 
     "name" : "ERCİYES APT. A-1" 
    }, 
    "longitude" : "41.00345215", 
    "latitude" : "28.65782942", 
    "aboneno" : "00005181209", 
    "bolge" : 1, 
    "sube" : { 
     "_id" : 4, 
     "name" : "AVCILAR", 
     "Bolgeid" : 0 
    }, 
    "kademeler" : [ 
     { 
      "kademeId" : 1567, 
      "isemriId" : 3661, 
      "elektrikselAdresNo" : 21649, 
      "isemirleri" : { 
       "_id" : null, 
       "id" : 3661, 
       "isemriNo" : 3661, 
       "anahtarKelime" : "", 
       "aciklama" : "deneme erkan1", 
       "emreAmade" : false, 
       "degistirmeSebebi" : "", 
       "acil" : false, 
       "longitude" : "28.65831040", 
       "latitude" : "41.00287477", 
       "il" : { 
        "_id" : 1, 
        "name" : "ISTANBUL" 
       }, 
       "basvuruTuru" : { 
        "_id" : 1, 
        "name" : "Bildirimli", 
        "id" : 1 
       }, 
       "kesintiTipi" : { 
        "_id" : 1, 
        "name" : "AG şube", 
        "id" : 1 
       }, 
       "havaKosulu" : { 
        "_id" : 1, 
        "name" : "Açık", 
        "id" : 1 
       }, 
       "kesintiDurumu" : { 
        "_id" : 1, 
        "name" : "Tamir edildi", 
        "id" : 2 
       }, 
       "gerilimTuru" : { 
        "_id" : 1, 
        "name" : "34,5 KV", 
        "id" : 1 
       }, 
       "sebekeUnsuru" : { 
        "_id" : 1, 
        "name" : "TM", 
        "id" : 1 
       }, 
       "isemriKaynagi" : { 
        "_id" : 1, 
        "name" : "İletim", 
        "id" : 1 
       }, 
       "birimi" : { 
        "_id" : 1, 
        "name" : "Kesinti", 
        "subeid" : 0, 
        "id" : 1 
       }, 
       "isemriSebebi" : { 
        "_id" : 1, 
        "name" : "Mücbir sebep", 
        "id" : 1 
       }, 
       "isemriSureTipi" : { 
        "_id" : 1, 
        "name" : "Uzun", 
        "id" : 1 
       }, 
       "arizaKapatmaTarihi" : null, 
       "baslamaZamani" : null, 
       "tahminiBitisZamani" : null, 
       "adres" : " ", 
       "basvuruSayisi" : 2, 
       "sonaErmeZamani" : null, 
       "kesintiSuresiSaat" : null, 
       "etkilenenKullaniciSayisi" : null, 
       "imarAlaniAg" : null, 
       "imarAlaniOg" : null, 
       "toplamEtkilenmeSureAg" : null, 
       "toplamEtkilenmeSureOg" : null, 
       "emreAmadeTarihi" : null, 
       "emreAmadeSureOg" : null, 
       "isemriBaslatan" : null, 
       "isemriDegistiren" : null, 
       "isemriKapatan" : null, 
       "kofraNo" : null, 
       "kaydeden" : null, 
       "ihbarTarihi" : null, 
       "direkNo" : null 
      } 
     } 
    ] 
} 

我用spring-data這個集合中查詢和我的查詢是這樣的一個:

Criteria criteria = Criteria 
        .where("kademeler.isemirleri.basvuruTuru.id").is(2) 
        .and("kademeler.isemirleri.isemriSureTipi.id").is(1) 
        .and("kademeler.isemirleri.kesintiDurumu.id").is(2); 

      Aggregation aggregation = newAggregation(
        match(criteria), 
        unwind("kademeler"), 
        match(criteria), 
        group("kademeler.isemirleri.isemriKaynagi.name", 
          "kademeler.isemirleri.isemriSebebi.name").count() 
          .as("etkilenenAboneSayisi") 
        ); 

isemriSebebiisemriKaynaginame字段具有相同的字段,名稱爲name。當我映射到對象aggregationResult時,它會給出錯誤'Same field error' 我能做些什麼來避免這個錯誤?因爲我所有的嵌入式文檔都有相同的字段name

回答

2

不是最清楚的記錄點。您需要Fields對象的不同表現在這裏正確地定義你的多場條件:

Aggregation aggregation = newAggregation(
    match(criteria), 
    unwind("kademeler"), 
    match(criteria), 
    group(
     Fields.from(
      Fields.field("name1", "kademeler.isemirleri.isemriKaynagi.name"), 
      Fields.field("name2", "kademeler.isemirleri.isemriSebebi.name") 
     )).count().as("etkilenenAboneSayisi") 
); 

正在使用Fields.field定義,有一個「名稱」,並使其正確地解釋了「目標」。使用普通字符串只會導致剝離所有內容的默認操作,直到字段名稱中的最後一個「點」爲止,並且根據您的錯誤,這些都是相同的事情。以這種形式指定將告訴構建者如何正確處理它。

這基本上將序列$group爲:

{ "$group": { 
    "_id": { 
     "name1": "$kademeler.isemirleri.isemriKaynagi.name", 
     "name2": "$kademeler.isemirleri.isemriSebebi.name" 
    }, 
    "etkilenenAboneSayisi": { "$sum": 1 } 
}} 

這是你想要的。

+0

偉大的一個,尼爾。感謝那。我已經提交了[DATAMONGO-1082](https://jira.spring.io/browse/DATAMONGO-1082)以跟蹤文檔的改進。 – 2014-10-31 09:07:53

+0

你是絕對正確的@Neil Lunn.That正是我需要的,謝謝。 – AknKplnoglu 2014-10-31 17:13:01