Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Sort on函数应用于MongoDB中数组元素中的每个项_C#_Mongodb_Mongodb .net Driver - Fatal编程技术网

C# Sort on函数应用于MongoDB中数组元素中的每个项

C# Sort on函数应用于MongoDB中数组元素中的每个项,c#,mongodb,mongodb-.net-driver,C#,Mongodb,Mongodb .net Driver,我有一个对象,其中包含一个字段,其中一个字段的度量值列表: public class TestObject { [BsonElement("graph")] public List<Measurement> Graph { get; set; } } public class Measurement { [BsonRequired] [BsonElement("magnitude")] public

我有一个对象,其中包含一个字段,其中一个字段的度量值列表:

public class TestObject {

    [BsonElement("graph")]
    public List<Measurement> Graph { get; set; }
}

public class Measurement {

    [BsonRequired]
    [BsonElement("magnitude")]
    public uint Magnitude { get; set; }

    [BsonRequired]
    [BsonElement("measured_on")]
    public DateTime MeasuredOn { get; set; }
}
但是,这当前引发了一个
NotSupportedException

System.NotSupportedException: 
The method OrderByDescending is not supported in the expression tree: 
{document}{graph}.OrderByDescending(r => r.MeasuredOn).

从这一点我可以理解,我尝试将LINQ表达式与MongoDB混合使用是行不通的,但我不知道如何使这个查询工作。任何帮助都将不胜感激。

不要认为使用
查找
界面是可能实现的。但是,
聚合
接口可以这样做:

let docLimit = 1;
let graphLimit = 2;

db.collection.aggregate(
    [
        {
            $project: {
                _id: 1,
                graph: 1
            }
        },
        {
            $unwind: "$graph"
        },
        {
            $sort: { "graph.measured_on": -1 }
        },
        {
            $group: {
                _id: "$_id",
                graph: { $push: "$graph" },
            }
        },
        {
            $set: { graph: { $slice: ["$graph", graphLimit] } }
        },
        {
            $set: { graphSum: { $sum: "$graph.magnitude" } }
        },
        {
            $sort: { graphSum: -1 }
        },
        {
            $limit: docLimit
        },
        {
            $unset: "graphSum"
        }
    ])

也不要认为您可以将上述聚合查询转换为强类型c#查询。您只需将json字符串传递给驱动程序。

我希望能够避免聚合,但我明白您的观点。但是,您提供的聚合似乎不起作用。它不限制
图形
属性中的条目数量,也不按日期对
图形
属性中的条目进行排序。
$sort:{“graph.measured_on”:-1}
按降序日期对图形项进行排序。然后它使用
$set:{graph:{$slice:[“$graph”,graphLimit]}
限制条目。查看mongoplayground示例数据。按日期排序时,第一个doc的震级为[40,30,20],第二个doc的震级为[30,20,10]。在限制了前两个条目之后,它们变成了[40,30]和[30,20],加起来就是[70]和[50]。当它被排序并限制为1时,结果是拥有70的文档,这是第一个文档。也许我误解了你的要求。您的预期输出是什么?我确实查看了您的mongoplayground链接,这就是我的反馈来源。我将第二项的一个测量值的大小更改为70,但它没有出现在列表的第一位。此外,日期排序不起作用。它似乎有效,因为输入已经排序。@Woody1193适合我。我把第二个doc的第二个数值改为50。现在它会按预期返回第二份文件。啊,我很抱歉。我必须解构它,自己构建它,看看它在做什么。是的,它确实有效。唯一的问题是排序和筛选应该保留在返回的数据中。
let docLimit = 1;
let graphLimit = 2;

db.collection.aggregate(
    [
        {
            $project: {
                _id: 1,
                graph: 1
            }
        },
        {
            $unwind: "$graph"
        },
        {
            $sort: { "graph.measured_on": -1 }
        },
        {
            $group: {
                _id: "$_id",
                graph: { $push: "$graph" },
            }
        },
        {
            $set: { graph: { $slice: ["$graph", graphLimit] } }
        },
        {
            $set: { graphSum: { $sum: "$graph.magnitude" } }
        },
        {
            $sort: { graphSum: -1 }
        },
        {
            $limit: docLimit
        },
        {
            $unset: "graphSum"
        }
    ])