【问题标题】:Select Last N documents of all Users in MongoDB Collection using C#使用 C# 选择 MongoDB 集合中所有用户的最后 N 个文档
【发布时间】:2016-06-17 09:03:04
【问题描述】:

我有一个 MongoDB 集合,我需要使用 C# MongoDB 查询选择每个员工 (Emp_ID) 的最后 3 个文档(按 LastUpdate 降序排列)。

样本集:

{
    "_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")
}

我知道选择一个员工信息

实验查询:

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();

请帮助我,如何使用 C# MongoDB Query 从上述集合中选择每个员工的最后 3 条记录(我更喜欢单个查询执行)。

【问题讨论】:

  • 你试过聚合吗?这就是所有员工都需要的

标签: c# mongodb mongodb-query mongodb-.net-driver


【解决方案1】:

数据使用的好例子!

为了实现这一点,我们需要使用聚合,$match - 按日期限制采取行动的元素数量,然后 $sort 按日期值降序对数据进行排序,$group - 按员工 ID 对记录进行分组,以及最后$project 对结果数组进行切片,只给我们三个第一位置。

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]
                    }
                }
            }
        ])

编辑

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; }
}

【讨论】:

  • 哇!在评论后的某一时刻,我也被卡住了。你太棒了
  • 你能不能把它翻译成C#。
  • 今晚试试:)
  • @IRPunch 添加了 c# 版本 :-)
猜你喜欢
  • 2014-10-24
  • 2017-08-03
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
  • 2018-07-20
相关资源
最近更新 更多