2016-06-17 8 views
0

MongoDBコレクションを持っています。各従業員の最後の3つのドキュメント(Emp_ID)を選択する必要があります。C#MongoDB Queryを使用して、MongoDBコレクション内のすべてのユーザーの最後のN個のドキュメントを選択します。

サンプルコレクション:

var collection = _database.GetCollection<Employee>("EmpInfo"); 
var filterBuilder = Builders<Employee>.Filter; 
var filter = filterBuilder.Eq("Emp_ID", "100"); 
var Item = collection.Find(filter) 
        .Sort(Builders<Employee>.Sort.Descending("LastUpdate")) 
        .Limit(3).ToList(); 

親切ごとの最後の3つのレコードを選択する方法を、私を助ける:

{ 
    "_id" : ObjectId("575f4e2efd14481598fc0ebf"), 
    "Emp_ID" : "100", 
    "LastUpdate" : ISODate("2016-06-13T18:30:00.000Z") 
}, 
{ 
    "_id" : ObjectId("575f4e2efd14481598fc0ec0"), 
    "Emp_ID" : "101", 
    "LastUpdate" : ISODate("2016-06-14T06:33:12.000Z") 
} 
, 
{ 
    "_id" : ObjectId("575f4e2efd14481598fc0ec1"), 
    "Emp_ID" : "101", 
    "LastUpdate" : ISODate("2016-06-14T06:33:16.000Z") 
} 
, 
{ 
    "_id" : ObjectId("575f4e2efd14481598fc0ec2"), 
    "Emp_ID" : "102", 
    "LastUpdate" : ISODate("2016-06-14T06:33:18.000Z") 
} 
, 
{ 
    "_id" : ObjectId("575f4e2efd14481598fc0ec3"), 
    "Emp_ID" : "100", 
    "LastUpdate" : ISODate("2016-06-14T06:33:26.000Z") 
} 
, 
{ 
    "_id" : ObjectId("575f4e2efd14481598fc0ec3"), 
    "Emp_ID" : "102", 
    "LastUpdate" : ISODate("2016-06-14T06:33:29.000Z") 
} 
, 
{ 
    "_id" : ObjectId("575f4e2efd14481598fc0ec4"), 
    "Emp_ID" : "101", 
    "LastUpdate" : ISODate("2016-06-14T06:34:18.000Z") 
} 
, 
{ 
    "_id" : ObjectId("575f4e2efd14481598fc0ec5"), 
    "Emp_ID" : "102", 
    "LastUpdate" : ISODate("2016-06-14T06:34:20.000Z") 
} 
, 
{ 
    "_id" : ObjectId("575f4e2efd14481598fc0ec6"), 
    "Emp_ID" : "100", 
    "LastUpdate" : ISODate("2016-06-14T06:34:31.000Z") 
} 
, 
{ 
    "_id" : ObjectId("575f4e2efd14481598fc0ec7"), 
    "Emp_ID" : "102", 
    "LastUpdate" : ISODate("2016-06-14T06:34:35.000Z") 
} 
, 
{ 
    "_id" : ObjectId("575f4e2efd14481598fc0ec8"), 
    "Emp_ID" : "101", 
    "LastUpdate" : ISODate("2016-06-14T06:34:38.000Z") 
} 

私は、単一の従業員情報

実験クエリを選択するために知っていますC#MongoDBクエリを使用して上記のコレクションからの従業員(私は単一のクエリの実行が好きです)。

+1

はあなたが集計してみました、あまりにも:-)それを使用する必要がありますか?それはあなたが全従業員に必要なものです – KaSh

答えて

1

データ使用の良い例!私たちが集合、$matchを使用する必要があることを取得するには

- 日付で行動に取り込ま要素の制限数は、その後、$sortは、日付値、$group降順で私たちのデータをソート - 従業員のIDによってグループのレコードを、そして最終的に$projectスライスの配列結果は3つのみです。

startDateは、単なるデータのリミッターとして使用されている - しかし、実際の生活の中であなたは

startDate = new Date() // Current date 
    startDate.setDate(startDate.getDate() - 7) // Subtract 7 days 


    db.irpunch.aggregate([{ 
       $match : { 
        LastUpdate : { 
         $gte : startDate 
        } 
       } 
      }, { 
       $sort : { 
        LastUpdate : -1 
       } 
      }, //sort data 
      { 
       $group : { 
        _id : "$Emp_ID", 
        documents : { 
         $push : "$$ROOT" 
        } 
       } 
      }, { 
       $project : { 
        _id : 1, 
        documents : { 
         $slice : ["$documents", 3] 
        } 
       } 
      } 
     ]) 

EDIT

public static void Main() 
{ 
    var client = new MongoClient("mongodb://localhost:27017"); 
    var database = client.GetDatabase("test"); 

    var collection = database.GetCollection<InnerDocument>("irpunch"); 


    var aggregationDocument = collection.Aggregate() 
     .Match(x=>x.LastUpdate> DateTime.Now.AddDays(-40)) 
     .SortByDescending(x => x.LastUpdate) 
     .Group(BsonDocument.Parse("{ _id:'$Emp_ID', documents:{ '$push':'$$ROOT'}}")) 
     .Project<AggregationResult>(BsonDocument.Parse("{ _id:1, documents:{ $slice:['$documents', 3]}}")).ToList() 
     ; 

    foreach (var aggregationResult in aggregationDocument) 
    { 
     foreach (var innerDocument in aggregationResult.documents) 
     { 
      Console.WriteLine($"empID: {aggregationResult._id}, doc date: {innerDocument.LastUpdate}"); 
     } 
     Console.WriteLine(); 
    } 

    Console.ReadLine(); 
} 


public class AggregationResult 
{ 
    public int _id { get; set; } 
    public InnerDocument[] documents { get; set; } 
} 

public class InnerDocument 
{ 
    public ObjectId Id { get; set; } 
    public string Emp_ID { get; set; } 
    public DateTime LastUpdate { get; set; } 
} 
+0

うわー!コメント後のある時点で、私はあまりにも立ち往生していた。あなたは素晴らしいです – KaSh

+0

ありがとうProfesor ...帽子オフ... –

+0

これをC#に翻訳してください。 –

関連する問題