2016-05-28 7 views
0

私はジオフィールド(lng/lat)を持つアドレスのコレクションを持っています。 これで、Google Mapsインスタンスにピンを設定するために、固有の地理情報/緯度のペアを持つドキュメントを取得したいと考えています。当然、私は複数のピンがお互いの上に座ることを望んでいないので、ユニークなlng/latペアだけを取得する必要があります。ユニークなフィールドを持つドキュメントを見つける

var mongoose = require("mongoose"), 
    Schema = mongoose.Schema; 

var VenueSchema = new Schema({ 
    name: String, 
    street: String, 
    streetNumber: String, 
    postCode: String, 
    suburb: String, 
    state: String, 
    geo: Array, // [lng, lat] 
}); 

var Venue = mongoose.model('Venue', VenueSchema); 

distinct operatorを使用すると、すべてのユニークなlng/latを簡単に取得できます。残念ながら、このクエリは、フィールドを持つドキュメントではなく、lng/latジオポイントの配列を返します。だから私はビジネス名がどんな地理的ポイントに属しているか分からない。

keystone.list('Venue').model.find().distinct('geo') 
    .exec(function(err, venues){ 

     if(err){ 
      throw err; 
     } 

     console.log(venues); // Array of lat/lng pairs 
}); 

2つのジオロケーションが同じでないすべてのフィールドで実際のドキュメントを取得するにはどうすればよいですか?

答えて

1

あなたが別個のような振る舞いを提供するために、$groupを使用していますが、より柔軟に集約パイプラインを使用することができます

keystone.list('Venue').model.aggregate([ 
    // Group the docs by the geo field, taking the first doc for each unique geo 
    {$group: { 
     _id: '$geo', 
     doc: { $first: '$$ROOT' } 
    }} 
], callback); 

$$ROOTは、パイプラインステージの入力文書が含まれているシステム変数です。したがって、これは各固有の最初の文書をgeoの値にします。

+0

ありがとうございました@JohnnyHK。それは魅力のように働く。 $$ ROOT変数のドキュメントを参照してください。それほど十分に文書化されていない。 https://docs.mongodb.com/manual/reference/operator/aggregation/group/ – ChrisRich

関連する問題