sql >> データベース >  >> NoSQL >> MongoDB

mongodbの各グループの最新のNレコードを取得するにはどうすればよいですか?

    mongoDB 3.2の場合 これは、次の形式の集計クエリを使用して実行できます。

    db.collection.aggregate(
      {$sort: {created: -1}},
      {$group: {_id:'$city', title:{$push: '$title'}},
      {$project: {_id:0, city: '$_id', mostRecentTitle: {$slice: ['$title', 0, 2]}}}
    )
    

    mongoDB3.0を使用して同じことを達成することは非常に困難です。 3.0でこれを達成するための非常に汚いトリックがあります。いくつかの手順とその他の収集が含まれます。

    最初に集計を実行し、結果を「aggr_out」と呼ばれる一時的なコレクションに出力します

    クエリ:

    db.collection.aggregate([
      {$sort: {created: -1}},
      {$group: {_id:'$city', title:{$push: '$title'}},
      {$project: {city: '$_id', mostRecentTitle: '$title'}},
      {$out: 'aggr_out'}]
    )
    

    上記のクエリを使用すると、mostRecentTitleは、インデックス0、1、2、...の順に並べられた最近のすべてのタイトルを持ちます。mostRecentTitleのインデックス0、1、および2の結果がすでにあるため、これを使用してこの結果に満足している場合。他のタイトルは、アプリケーション側では単純に無視できます。

    それでも満足できない場合は、出力コレクション'aggr_out'を更新して、このコレクションからデータを読み取ります。クエリは、

    db.aggr_out.update(
      {},
      {$push: {
        mostRecentTitle: {$each:[], $slice:3}
        }
      }
    )
    

    上記の操作では、mostRecentTitle配列がスライスされ、最新の3つのタイトルが含まれるようになります。このコレクションを読んで、希望する結果を取得してください。




    1. 配列のサブドキュメントにフィールドが存在するかどうかを確認します

    2. 文字列でjsonを使用して集約mongoクエリを実行するにはどうすればよいですか?

    3. TravisCIでRedisを実行する

    4. 同じステートメントでpopulateとaggregateを使用する方法は?