C# 对子集合进行排序并返回第一个子集合文档

C# 对子集合进行排序并返回第一个子集合文档,c#,mongodb,mongo-c-driver,C#,Mongodb,Mongo C Driver,我有一个文档集,看起来像这样: { "_id": ObjectId("507f191e810c19729de860ea"), "SubCollection": [{ "_id": ObjectId("55849c0002cee826cc67550a"), "Timestamp": NumberLong(635717988841453845), "IsValid": true }, { "_id": O

我有一个文档集,看起来像这样:

{
    "_id": ObjectId("507f191e810c19729de860ea"),
    "SubCollection": [{
        "_id": ObjectId("55849c0002cee826cc67550a"),
        "Timestamp": NumberLong(635717988841453845),
        "IsValid": true
    },
    {
        "_id": ObjectId("507f1f77bcf86cd799439011"),
        "Timestamp": NumberLong(635717988830033174),
        "IsValid": true
    }]  
}

    public class RootEntity
    {
        public ObjectId Id { get; set; }
        public List<SubEntity> SubCollection { get; set; }
    }

    public class SubEntity
    {
        public ObjectId Id { get; set; }
        public long Timestamp { get; set; }
        public bool IsValid { get; set; }
    }
{
“_id”:ObjectId(“507f191e810c19729de860ea”),
“子集合”:[{
“_id”:ObjectId(“55849c0002cee826cc67550a”),
“时间戳”:数字长(635717988841453845),
“IsValid”:true
},
{
“_id”:ObjectId(“507f1f77bcf86cd799439011”),
“时间戳”:数字长(635717988830033174),
“IsValid”:true
}]  
}
公共类根实体
{
公共对象Id{get;set;}
公共列表子集合{get;set;}
}
公共类子实体
{
公共对象Id{get;set;}
公共长时间戳{get;set;}
公共bool有效{get;set;}
}
我需要创建一个mongo查询,返回仅包含第一个子集合项的文档。但是,子集合需要首先通过IsValid bool进行过滤,然后根据时间戳进行排序

到目前为止,我有一个查询返回带有第一个子集合项的文档,但我无法让它首先对子集合进行排序,这可以实现吗

这是我到目前为止的查询,请注意,我使用的是C#.NET MongoDB驱动程序v2.0:

        var filter = Builders<TestFocusEntity>.Filter.And(
            Builders<RootEntity>.Filter.Eq(x => x.Id, id),
            Builders<TestFocusEntity>.Filter.ElemMatch(x => x.SubCollection, sub => test.IsValid == true));

        var result = await collection.Find(filter)
            .Sort(Builders<RootEntity>.Sort.Ascending("SubCollection.$.Timestamp"))
            .Project<RootEntity>(Builders<RootEntity>.Projection.Slice(x => x.SubCollection, 0, 1))
            .ToListAsync();

        var rootDocument = result.SingleOrDefault();
        var subDocument = rootDocument == null
            ? null
            : rootDocument.SubCollection.SingleOrDefault();
var filter=Builders.filter.And(
Builders.Filter.Eq(x=>x.Id,Id),
Builders.Filter.ElemMatch(x=>x.SubCollection,sub=>test.IsValid==true);
var result=await collection.Find(过滤器)
.Sort(Builders.Sort.升序(“子集合.$.Timestamp”))
.Project(Builders.Projection.Slice(x=>x.SubCollection,0,1))
.ToListAsync();
var rootDocument=result.SingleOrDefault();
var subDocument=rootDocument==null
? 无效的
:rootDocument.SubCollection.SingleOrDefault();

时间戳字段上的排序将对匹配的文档进行排序(这将无效,因为最多只有1个id匹配的文档)。它不会对匹配文档中的数组进行排序。在MongoDB中根本不可能在DB上的数组中进行这样的排序,这不是C#驱动程序的限制

请参见有关数组排序的信息:

使用数组。。。升序排序比较数组中最小的元素

i、 它是按照每个文档中数组的最小值对文档进行排序,而不是在数组中进行排序

如果子实体数组相当小,则可以在收回整个数组后在内存中执行该部分操作

如果子实体数组非常大,您可能需要重新考虑文档架构,以避免每次都将整个文档和子集合拉回到内存中。例如,使每个子实体都成为自己的文档