【问题标题】:Retrieve only documents with the highest value仅检索具有最高值的文档
【发布时间】:2016-12-30 19:24:57
【问题描述】:

我想编写一个查询来查找具有最高值的文档。有多个具有相同值的文档,我想要它们。

我知道我可以使用 sort 从高到低排序。但我不知道有多少文件。所以这行不通。

{
     total: 1,
     id: 1
},
{
    total: 1,
    id: 2
},
{
    total: 2,
    id: 3
},
{
    total: 2,
    id: 4
},
{
    total: 3,
    id: 5
},
{
    total: 3,
    id: 6
}

在本例中,我希望它返回所有总计为3 的文档。 如何查询所有具有最高值的文档?

【问题讨论】:

标签: mongodb mongoose aggregation-framework


【解决方案1】:

这对你有用:

db.yourcollectionname.aggregate([
    {
        $group:{
            _id: null,
            high_val: {$max:"$total"}
        }
    },
    {
        $lookup:{
           from: "yourcollectionname",
           localField: "high_val",
           foreignField: "total",
           as: "elements"
        }
    },
    {
        $unwind: "$elements"
    },
    {
        $project:{
            _id:false,
            id: "$elements.id",
            total: "$elements.total"
        }
    }
]);

这里 $lookup 用于获取从初始 $group 检索到的最大值,并将其应用回同一张表以检索匹配记录。

我确信有更好的方法可以做到这一点,但我无法抗拒,因为我刚刚开始使用 $lookup,所以只是探索它可以做什么。

【讨论】:

    【解决方案2】:

    你可以这样做

    var a = db.tot.find().sort({"total":-1});
     var maxTotal = 0; 
     while (a.hasNext()) {
    
        var doc1 = a.next();
    
            if (doc1.total>=maxTotal) {
                maxTotal = doc1.total;
            }else {
                break;
            }
        db.doc2.insert(doc1);
    
     }
    

    现在您拥有集合 doc2 中所有价值最高的文档

    【讨论】:

    • 为什么是负面评价?你甚至运行过代码吗?我在本地尝试过,它有效..
    • 嘿,我没有对你投反对票。谢谢你的回答!
    猜你喜欢
    • 1970-01-01
    • 2014-11-17
    • 2023-01-30
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    相关资源
    最近更新 更多