2017-01-28 10 views
2

私はこのようになります文書のコレクションがあります。MongoDBのコレクションから一致するキーとの最後のN個の要素を取得する方法

[ 
{ 
    "_id": "588cf61e5120ac11d4366f5c", 
    "title": "This is a test entry", 
    "entrybody": "This is the body of an entry", 
    "creationdate": 1111, 
    "author": "1223cllclclclc", 
    "__v": 0 
    }, 
{ 
    "_id": "588cf6a556414f02f4e6a865", 
    "title": "This is a new entry", 
    "entrybody": "This is the body of an nuew entry", 
    "creationdate": 11114040050505, 
    "author": "1223cllclclclclslslsl", 
    "__v": 0 
}, 
{ 
    "_id": "588cf767fc2ede200cd5738e", 
    "title": "This is a new entry", 
    "entrybody": "This is the body of an nuew entry", 
    "creationdate": 11114040050505, 
    "author": "1223cllclclclclslslsl", 
    "__v": 0 
    } 
    ..... 
] 

は、私は各著者の最後のn個のレコードを取得するようにして、考えを作成日にそれらを注文すると、私は集計でこれを行う方法を見ていますが、私は立ち往生しています。

コレクションの特定のキー(たとえばauthor)と一致するコレクションの最後のN個のドキュメントが必要です。その結果を「作成日」でソートする必要があります。私はこの質問とは違うと思う。mongodb: how to get the last N records?

ありがとうございます。

+0

のように著者名で区切られた文書で満たされていますそれは私の質問に答えていない、それはコレクションの最後のN文書を取得する方法を示していますが、expecifiと一致する最後のNレコードを取得することには何も関係ありませんcキーを押して、その結果を作成日順にソートします。 –

+0

クエリ条件を含めるだけです。 '(" "createda te": - 1))。limit(10) ';(' 'author": "somevalue" – Veeram

+0

それはただ1人の著者のためのドキュメントを返すでしょう、私はすべての著者のための最後のNドキュメントを返すためにクエリを必要とします。 –

答えて

1

このようなことを試すことができます。

$sortauthorのレコードを最後に処理します。creationdate

$groupおよび$projectは、それぞれauthorの最後のNレコードを選択します。

$unwindおよび$sortは、レコードをcreationdateで処理します。ここで

db.collection.aggregate({ 
    $sort: { 
     author: 1, 
     creationdate: -1 
    } 
}, { 
    $group: { 
     _id: "$author", 
     data: { 
      $push: "$$ROOT" 
     } 
    } 
}, { 
    $project: { 
     _id: 0, 
     lastN: { 
      $slice: ["$data", N] 
     } 
    } 
}, { 
    $unwind: "$lastN" 
}, { 
    $sort: { 
     "lastN.creationdate": -1 
    } 
}) 
+0

ありがとう、それはほとんど私のためのトリックをした、私は必要に応じて動作させるために.sort()でcreationdateによってオブジェクトの結果の配列を再度ソートしなければならなかった。 –

+0

Np。ソートする必要はありません。それが欠けていたように答えを修正しました。最後のソートは必要なものです。 – Veeram

0

forEach方法の助けを借りて問題を解決するための代替手段です:実行後

var result = {}; 
db.collection.find().sort({"author": 1, "creationda‌‌te":-1}).forEach(function(doc) { 
    if (!(doc.author in result)) { 
     result[doc.author] = []; 
    } 
    if (result[doc.author].length < 5) { 
     result[doc.author].push(doc); 
    } 
}) 

result変数は

{ 
    'author1': [ 
     {doc1}, 
     {doc2} 
    ], 
    'author2': [ 
     {doc1}, 
     {doc2} 
    ] 
} 
関連する問題