2017-01-03 8 views
4

MongoDBを使用してMongoDBデータベースにアクセスするための小さなNodeJS Webアプリケーションを開発しています。私のコレクションの単純化されたスキーマは以下の通りである:Mongooseでソート関数を定義する方法

var MySchema = mongoose.Schema({         
    content: { type: String },  
    location: {               
     lat:  { type: Number },      
     lng:  { type: Number },            
    }, 
    modifierValue: { type: Number }  
}); 

は残念ながら、私は、サーバーから、それは私にとってより便利な方法を取得したデータをソートすることはできませんよ。与えられた位置(の位置)からの距離に応じて結果を並べ替えるが、modifierValueの修飾子関数を考慮に入れて入力と見なしたい。

私が意図していることは以下のとおりです。しかし、この種のソート機能は存在しないようです。

MySchema.find({}) 
     .sort(modifierFunction(location,this.location,this.modifierValue)) 
     .limit(20)  // I only want the 20 "closest" documents 
     .exec(callback) 

mondifierFunctionはDoubleを返します。

これまでは、mongooseの$ near関数を使用する可能性について検討しましたが、これはソートしていないように見えますが、修飾子関数は使用できません。

私はnode.jsとmongooseにかなり新しいので、私は自分の問題に完全に間違ったアプローチをしているかもしれないので、私は自分のプログラミングロジックの再設計を完了するために開いています。

は、あなたがこの既に与えられた質問の日付への答えを見つけたかもしれないが、私はとにかくお答えします、事前に

答えて

1

、ありがとうございました。

高度なソートアルゴリズムでは、execコールバックでソートを実行できます。例えば

MySchema.find({}) 
    .limit(20) 
    .exec(function(err, instances) { 
     let sorted = mySort(instances); // Sorting here 

     // Boilerplate output that has nothing to do with the sorting. 
     let response = { }; 

     if (err) { 
      response = handleError(err); 
     } else { 
      response.status = HttpStatus.OK; 
      response.message = sorted; 
     } 

     res.status(response.status).json(response.message); 
    }) 

mySort()は、入力として、クエリの実行、出力としてソートされた配列から見つかった配列を有しています。これは、例えば、次のようなものになる可能性があります。

function mySort (array) { 
    array.sort(function (a, b) { 
    let distanceA = Math.sqrt(a.location.lat**2 + a.location.lng**2); 
    let distanceB = Math.sqrt(b.location.lat**2 + b.location.lng**2); 

    if (distanceA < distanceB) { 
     return -1; 
    } else if (distanceA > distanceB) { 
     return 1; 
    } else { 
     return 0; 
    } 
    }) 

    return array; 
} 

この並べ替えアルゴリズムは、並べ替えがどのように実行されたかを示しています。もちろん、適切なアルゴリズムを自分で書く必要があります。クエリの結果は、必要に応じて操作できる配列であることに注意してください。 array.sort()はあなたの友人です。それについての情報はhereです。

関連する問題