2012-11-07 13 views
11

Kayan nokta sayısı olan oran özniteliğine sahip belgeler içeren bir koleksiyona sahip olduğumu varsayalım.mongodb - En yakın tamsayı değere sahip belgeyi bulun

{'ratio':1.437} 

nasıl bir sürücü kullanarak ve abs(x-ratio) en küçük değere sahip bir bulgu belleğe hepsini yüklemeden verilen bir tamsayı en yakın değere sahip tek bir belge bulmak için bir sorgu yazabilirim?

cevap

17

İlginç bir sorun. Tek bir sorguda bunu yapabilir bilmiyorum ama ikisi de yapabilirsiniz:

var x = 1; // given integer 
closestBelow = db.test.find({ratio: {$lte: x}}).sort({ratio: -1}).limit(1); 
closestAbove = db.test.find({ratio: {$gt: x}}).sort({ratio: 1}).limit(1); 

Sonra sadece hedef tamsayıya ratio yakın sahiptir iki dokümanlar hangi kontrol edin.

MongoDB 3.2 Güncelleme

3.2 sürüm ekler şimdi bu tek aggregate sorguda yapılması sağlar $abs mutlak değer toplama operatörü için destek: Başka bir fikrim var

var x = 1; 
db.test.aggregate([ 
    // Project a diff field that's the absolute difference along with the original doc. 
    {$project: {diff: {$abs: {$subtract: [x, '$ratio']}}, doc: '$$ROOT'}}, 
    // Order the docs by diff 
    {$sort: {diff: 1}}, 
    // Take the first one 
    {$limit: 1} 
]) 
5

, ama çok zor ve veri yapınızı değiştirmek gerekiyor.

First, bu yapıya verilerinizi değiştirip 0

{'ratio':[1.437, 0]} 

ile ikinci değer tutmak Sonra en yakın oranını bulmak için $near operatörünü kullanabilirsiniz

MongoDB tarafından desteklenen hangi geolocation index kullanabilirsiniz değer ve işleç verdiğiniz tamsayı ile mesafeye göre sıralanmış bir liste döndürdüğü için, yalnızca en yakın değeri almak için limit kullanmanız gerekir. Bunu yapmak istemiyorsanız

db.places.find({ ratio : { $near : [50,0] } }).limit(1) 

, ben sadece JohnnyHK cevabı :) @ kullanabilirsiniz düşünüyorum

+0

... seni bu vereceğim düşünüyorum ben bu şekilde coğrafi konum uygulayarak kabul etmişti Bir atış. Oran değeri aslında bir görüntünün en boy oranıdır, bu yüzden widthxheight'ı boyutsal bir sorgu olarak ele alabilirim. – DeaconDesperado

İlgili konular