2012-11-07 14 views
11

के साथ दस्तावेज़ ढूंढें मान लें कि मेरे पास एक अनुपात विशेषता वाले दस्तावेज़ों के साथ संग्रह है जो फ़्लोटिंग पॉइंट नंबर है।mongodb - निकटतम पूर्णांक मान

{'ratio':1.437} 

मैं उन सभी को स्मृति में लोड हो रहा है एक ड्राइवर का उपयोग करने और abs(x-ratio) का सबसे छोटा मान के साथ एक खोजने के बिना उसकी पूर्णांक के सबसे करीब मान के साथ एकल दस्तावेज़ को खोजने के लिए एक प्रश्न कैसे लिख सकता हूँ?

उत्तर

17

दिलचस्प समस्या। मैं यदि आप एक ही प्रश्न में यह कर सकते हैं पता नहीं है, लेकिन आप दो में कर सकते हैं:

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); 

तो फिर तुम सिर्फ जाँच जो दो दस्तावेज़ों की है लक्ष्य पूर्णांक तक ratio निकटतम।

MongoDB 3.2 अद्यतन

3.2 रिलीज कहते हैं $abs निरपेक्ष मूल्य एकत्रीकरण ऑपरेटर जो अब इस एक भी aggregate क्वेरी में किया जा करने की अनुमति देता के लिए समर्थन:

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

मैं एक विचार है, लेकिन बहुत मुश्किल है और अपनी डेटा संरचना को बदलने की जरूरत है।

आप geolocation index उपयोग कर सकते हैं जो MongoDB द्वारा समर्थित

पहले, इस संरचना के लिए अपने डेटा को बदलने और साथ 0

{'ratio':[1.437, 0]} 

दूसरा मान रखना तो फिर तुम $near ऑपरेटर का उपयोग कर सकते करीबी अनुपात को खोजने के लिए मान, और क्योंकि ऑपरेटर आपके द्वारा दिए गए पूर्णांक के साथ दूरी से क्रमबद्ध एक सूची लौटाता है, इसलिए आपको केवल निकटतम मूल्य प्राप्त करने के लिए limit का उपयोग करना होगा।

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

यदि आप ऐसा करना नहीं चाहते हैं, मुझे लगता है कि तुम सिर्फ उपयोग कर सकते हैं @ JohnnyHK के जवाब :)

+0

मैं जियोलोकेशन इस तरह से लागू करने पर विचार किया था ... मुझे लगता है कि मैं इस देने के लिए जा रहा हूँ एक दृश्य। अनुपात मान वास्तव में एक छवि का एक पहलू अनुपात है, इसलिए मैं चौड़ाई की दृष्टि को आयामी क्वेरी के रूप में देख सकता हूं। – DeaconDesperado

संबंधित मुद्दे