我在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")
);
但name
和isemriSebebi
的{{1}}字段都有相同的字段isemriKaynagi
。当我映射到一个对象name
时,它会给出一个错误aggregationResult
我该怎么做才能避免这个错误?因为嵌入式文档的所有类都具有名为'Same field error'
的相同字段。
答案 0 :(得分: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 }
}}
这就是你想要的。