Mongoose Array İçinde Arama
-
Merhabalar,
Node.js ile bir yerde takıldım.
Mongo veritabanında isime göre veri alıyorum. Her verinin içinde de array olarak notlar var. İsteğim notlar içinde onay: false olanlar gösterilmesin.
Örnek olarak;
{ isim:"ahmet", soyisim: "mehmet", notlar:[ {onay: false, yer:'istanbul'}, {onay: true, yer:'bursa'}, {onay: false, yer: 'ankara'}, ] }
Mongoose ile Kullanicilar.findOne({isim: 'ahmet'}) diye çektiğimde nasıl bir kod daha yazmalıyım ki notlar içindeki array da sadece bursa dönsün.
-
Çok fazla hakim olmamakla birlikte belki yardımcı olur düşüncesiyle fikir yürütüyorum.
İsme göre veriyi çekip yeni bir liste yapıp onun da içinde .map() işlemi uygulasak onu da yeni list ya da array a koysak iş görmez mi?
Kullanicilar.findOne({isim: 'ahmet'})
newAhmet = {
isim:"", soyisim: "", notlar:[]
}
ahmet.notlar.map(onay=>{
if(onay == true){
newAhmet.isim = ahmet.isim
newAhmet.soyisim = ahmet.soyisim
ahmet.notlar.push(onay)
}
})
Gibi bir yöntem nasıl olur.
NOT: Kodlar muhtemelen yanlış sadece fikir vermesi açısından bildiğim kadar yazdım
-
direkt notlar.yer diye aratabilirsin
{$and: [{isim:"ahmet"}, {"notlar.yer":"istanbul"}]}
-
Hocam benim anladığım Ahmeti aramak bulmak istiyor ama ekranda adresler kısmında sadece "TRUE" olanlar yazsın istiyor. Örneğin adamın şuanki ikamet adresi bursa ve ben ekranda güncel olan bursayı göreyim istanbul ve ankara görünmesin. Sanırım böyle birşey istiyor.
-
tahta bunu yazdı
Hocam benim anladığım Ahmeti aramak bulmak istiyor ama ekranda adresler kısmında sadece "TRUE" olanlar yazsın istiyor. Örneğin adamın şuanki ikamet adresi bursa ve ben ekranda güncel olan bursayı göreyim istanbul ve ankara görünmesin. Sanırım böyle birşey istiyor.
project kısmında sorgu veremiyosun mongoda. buysa istedigi aggregationla yapilabilir, $unwind edip çıkan şeye match yapacaksin falan.
ama bence dokümanlar çok büyük değilse gerek yok onun yerine javascript tarafında zaten ihtiyacın olmayanı kullanmazsın
şöyle bişeyle filtrelenebilir:
var notlar = result.notlar var arananSehir = "istanbul" var istanbulNotlar = notlar.filter(function(e){ return e.yer == arananSehir })
-
Hocam bu konuda birşey diyemeyeceğim benim bilgim burada bitti :))
-
tahta bunu yazdı
Hocam benim anladığım Ahmeti aramak bulmak istiyor ama ekranda adresler kısmında sadece "TRUE" olanlar yazsın istiyor. Örneğin adamın şuanki ikamet adresi bursa ve ben ekranda güncel olan bursayı göreyim istanbul ve ankara görünmesin. Sanırım böyle birşey istiyor.
Evet, tam olarak bu.
Notlar kısmında da dokümanlar büyük olduğu icin direkt sorguda azaltmam gerekiyor.
-
yolbulucu bunu yazdıtahta bunu yazdı
Hocam benim anladığım Ahmeti aramak bulmak istiyor ama ekranda adresler kısmında sadece "TRUE" olanlar yazsın istiyor. Örneğin adamın şuanki ikamet adresi bursa ve ben ekranda güncel olan bursayı göreyim istanbul ve ankara görünmesin. Sanırım böyle birşey istiyor.
project kısmında sorgu veremiyosun mongoda. buysa istedigi aggregationla yapilabilir, $unwind edip çıkan şeye match yapacaksin falan.
ama bence dokümanlar çok büyük değilse gerek yok onun yerine javascript tarafında zaten ihtiyacın olmayanı kullanmazsın
şöyle bişeyle filtrelenebilir:
var notlar = result.notlar var arananSehir = "istanbul" var istanbulNotlar = notlar.filter(function(e){ return e.yer == arananSehir })
{$match: {isim:'ahmet'}},
{$unwind: '$notlar'},
{$match: {'notlar.onay': true}}şeklinde bir kod yazdım ama çalışmadı. [] olarak boş donuyor.
Yani Ahmet'in sayfasına girdiğinde Ahmet'in bilgileri gelecek ve sayfanın en altında notlar kısmında sadece true olanlar görünecek. -
biri bunu yazdıtahta bunu yazdı
Hocam benim anladığım Ahmeti aramak bulmak istiyor ama ekranda adresler kısmında sadece "TRUE" olanlar yazsın istiyor. Örneğin adamın şuanki ikamet adresi bursa ve ben ekranda güncel olan bursayı göreyim istanbul ve ankara görünmesin. Sanırım böyle birşey istiyor.
Evet, tam olarak bu.
Notlar kısmında da dokümanlar büyük olduğu icin direkt sorguda azaltmam gerekiyor.
Hocam benim aklıma direk iki array değişkene atayıp tek tek sorgulamak geldi ama Yolbulucunun Söylediği gibi daha stabil gibide geldi çok fazla node.js bilmiyorum ama
const sweetArray = [2, 3, 4, 5, 35] const sweeterArray = sweetArray.map(sweetItem => { return sweetItem * 2 }) console.log(sweeterArray)
yani ilk değeri alıp return edip istediğin sorguyu yazabilirsin diye düşünüyorum
-
biri bunu yazdıtahta bunu yazdı
Hocam benim anladığım Ahmeti aramak bulmak istiyor ama ekranda adresler kısmında sadece "TRUE" olanlar yazsın istiyor. Örneğin adamın şuanki ikamet adresi bursa ve ben ekranda güncel olan bursayı göreyim istanbul ve ankara görünmesin. Sanırım böyle birşey istiyor.
Evet, tam olarak bu.
Notlar kısmında da dokümanlar büyük olduğu icin direkt sorguda azaltmam gerekiyor.
ha pardon hocam yanlis anlamisim yeni uyanmistim
aggregate deki filterla yapabilirsin sanirim bunu ya
https://docs.mongodb.com/manual/reference/operator/aggregation/filter/
simdi yazdim bi turlu calismadi syntax hatasi yaptim kesin, sen biraz kurcalarsin
{ "notlar": $filter: { input :"$notlar", as: 'item', cond: { $gte: [ "$item.onay", true ] } } }
-
bu şekilde çekebilirsin
db.collection.aggregate( // Start with a $match pipeline which can take advantage of an index and limit documents processed { $match: { "notlar.onay": true } }, { $unwind: "$notlar" }, { $match: { "notlar.onay": true } })
Sonuç: