我們假設我有一個具有比率屬性(浮點數)的文檔集合。mongodb - 查找具有最接近的整數值的文檔
{'ratio':1.437}
如何編寫一個查詢來找到最接近的值給定的整數的單個文檔,而無需使用驅動程序,並找到一個與abs(x-ratio)
最小值他們都加載到內存?
我們假設我有一個具有比率屬性(浮點數)的文檔集合。mongodb - 查找具有最接近的整數值的文檔
{'ratio':1.437}
如何編寫一個查詢來找到最接近的值給定的整數的單個文檔,而無需使用驅動程序,並找到一個與abs(x-ratio)
最小值他們都加載到內存?
有趣的問題。我不知道你是否能在單個查詢做到這一點,但你可以在兩個做到這一點:
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}
])
我有另一個想法,但非常棘手,需要改變你的數據結構。
可以使用geolocation index它通過MongoDB的支持
首先,你的數據更改爲這種結構,並保持第二值0
{'ratio':[1.437, 0]}
然後你可以使用$near
運營商找到最接近的比值,並且由於運算符使用您給出的整數返回按距離排序的列表,所以必須使用limit
才能得到最接近的值。
db.places.find({ ratio : { $near : [50,0] } }).limit(1)
如果你不想這樣做,我認爲你可以僅使用@ JohnnyHK的答案:)
我曾經考慮過申請地理位置這樣......我想我會把這一槍。比例值實際上是圖像的縱橫比,所以我可以將widthxheight作爲尺寸查詢。 – DeaconDesperado