2016-05-04 19 views
1

私はMongoDB集約演算子を使用して最後のレコードを取得しようとしています(フィックスタイムである 'fixtm'に基づく)。各レコードには、デバイスID、fixtime、緯度、経度、スピードなどのその他の情報があります。私の下の集計は、各デバイスの最終レコードを返すようにうまく機能します。しかし、私は緯度、経度などの他のフィールドをどのように取得するのですか?私はlat: 1のようなものを$プロジェクトリストに追加しようとしましたが、試したバリエーションの数に関係なく、他の値は表示されません。彼らはグループオペレータの_idフィールドなどに存在しないからだと思いますか?どんなポインタでも大変役に立ちます。私は上から取得しています何のおかげMongoDB集約 - グループ化、結果内の追加フィールドを選択

function() { 
    return db.gpspos.aggregate(
     [ 
      { 
       $sort: { 
        devid: 1, 
        fixtm: 1 
       } 
      }, { 
       $group: { 
        _id: "$devid", 
        lastData: { 
         $last: "$fixtm" 
        } 
       } 
      }, { 
       $project: { 
        _id: 0, 
        device_id: '$_id', 
        fixtime: '$lastData' 
       } 
      } 
     ] 
    ) 
} 

は私が私のMongoDB

{ 
    "_id": { 
     "$oid": "5729dc83f5be2411fb28c7c3" 
    }, 
    "devid": 5, 
    "devnm": "M.M (Samsung S3)", 
    "fixtm": 1462360893000, 
    "addr": "{address}", 
    "lat": 1.433775, 
    "lon": 103.7859717, 
    "spdkm": 0 
} 
でこの

{ "device_id" : 5, "fixtime" : 1462368405000, "speed": 70.3, "lat": 103.33434 } 
{ "device_id" : 4, "fixtime" : 1462372097000, "speed": 70.3, "lat": 101.33434 } 

文書の一例であるで探しています何

{ "device_id" : 5, "fixtime" : 1462368405000 } 
{ "device_id" : 4, "fixtime" : 1462372097000 } 

です

+0

上記の結果を得ているいくつかのサンプル文書を含むように質問を編集できますか? – chridam

+0

確かにchridam、done –

答えて

2

他のフィールドに戻るには同じ$lastオペレータをオペレーション内で使用することもできます。

function() { 
    return db.gpspos.aggregate(
     [ 
      { 
       $sort: { 
        devid: 1, 
        fixtm: 1 
       } 
      }, { 
       $group: { 
        _id: "$devid", 
        lastData: { $last: "$fixtm" }, 
        speed: { $last: "$spdkm" }, 
        address: { $last: "$address" }, 
        lat: { $last: "$lat" }, 
        lon: { $last: "$lon" } 
       } 
      }, { 
       $project: { 
        _id: 0, 
        device_id: '$_id', 
        fixtime: '$lastData', 
        speed: 1, 
        address: 1, 
        lat: 1, 
        lon: 1 
       } 
      } 
     ] 
    ) 
} 
+0

ああ、私は必要なものがfixtm(unix時間)に基づく最後のレコードであっても、他のフィールドに$ last accumulatorを使わなければならないでしょうか?だから私はfixtmの最後のレコードを最初に見つけて、それから残りのレコードを見つけるでしょう - それで返されるものには影響しませんか?それは論理ですか? –

+0

Linuxの「パイプ」コンテキストでの集約パイプラインを考えてみましょう。 MongoDBは、パイプラインを実行するとき、演算子を互いにパイプ処理します。つまり、演算子の出力は、次の演算子の入力になります。各演算子の結果は、新しい文書集合です。したがって、最終パイプライン段階でフィールドを返す場合は、前の演算子の結果でなければなりません。この場合、他のフィールドは '$ group'パイプラインから来るべきです。 SQLの場合と同じように、集計関数のいずれかを使用しない限り、GROUP BYを使用することはできません。 MongoDBでは '$ last'や$ first'を使う必要があります – chridam

+0

私はちょっと分かりやすいですが、単純な説明だけです - 数値でないフィールドを含める必要がある場合はどうしたらいいですか?たとえば、アドレス(addr)とします。 $はそれに対してどのようにして最後に成立するだろうか?申し訳ありませんが、私はMongoDBを完全に新しくしていますので、物事をゆっくりと消化しようとしています:) –

関連する問題