Select MongoDB 集合中所有用户的最后 N 个文档,使用 C#
Select Last N documents of all Users in MongoDB Collection using C#
我有一个 MongoDB 集合,我需要 Select 使用 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")
}
我知道 select 一个员工信息
实验查询:
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 查询 Select 上述集合中每个员工的最后 3 条记录(我更喜欢执行单个查询)。
数据使用的好例子!
为了做到这一点,我们需要使用聚合,$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; }
}
我有一个 MongoDB 集合,我需要 Select 使用 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")
}
我知道 select 一个员工信息
实验查询:
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 查询 Select 上述集合中每个员工的最后 3 条记录(我更喜欢执行单个查询)。
数据使用的好例子!
为了做到这一点,我们需要使用聚合,$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; }
}