MongoDB获取所有字段+;按从多个字段计算的值排序

MongoDB获取所有字段+;按从多个字段计算的值排序,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我需要从MongoDB中收集文件。单个文档如下所示: { name : "John Doe", address : "Some cool address", value1 : 2, value2 : 3, value3 : 5 } db.someCollection.aggregate( { $project: { sum: { $add: [ "$value1", "$value2", "$v

我需要从MongoDB中收集文件。单个文档如下所示:

{
    name    : "John Doe",
    address : "Some cool address",
    value1  : 2,
    value2  : 3,
    value3  : 5
}
db.someCollection.aggregate(
    {
        $project: {
            sum: { $add: [ "$value1", "$value2", "$value3" ] }
        },
        $sort: {
            sum: -1
        }
    }
)
我需要检索所有字段,并按
value1+value2+value3
的数字降序对文档进行排序

我找到的唯一解决方案(不完整,因为它无法检索所有字段)如下所示:

{
    name    : "John Doe",
    address : "Some cool address",
    value1  : 2,
    value2  : 3,
    value3  : 5
}
db.someCollection.aggregate(
    {
        $project: {
            sum: { $add: [ "$value1", "$value2", "$value3" ] }
        },
        $sort: {
            sum: -1
        }
    }
)
就像我说的,这只返回
sum
字段,这不是我想要的

编辑:而且文档实际上有点大,所以我不想使用伪解决方案,比如

$project: {
    name:    1,
    address: 1,
    ...
}

i、 e.我想要一些通用的可重用解决方案,而不是特定于具体情况的解决方案。请尝试以下查询:

db.myCollection.aggregate(
{$project: {name : "$name", 
            address : "$address", 
            value1 : "$value1", 
            value2 : "$value2", 
            value3 : "$value3",
            sum : {$add : ["$value1", "$value2", "$value3"]}}},
{$sort: {sum: -1}}
)
据我所知,MongoDB中没有类似于按条件排序的选项。默认情况下,也没有将所有字段添加到项目中的选项。这是一个问题,但尚未解决


现在,另一个选项是创建新字段(例如:totalValues),并在值字段更改时将总和存储在该字段中。然后,您可以按总值排序

尝试以下查询:

db.myCollection.aggregate(
{$project: {name : "$name", 
            address : "$address", 
            value1 : "$value1", 
            value2 : "$value2", 
            value3 : "$value3",
            sum : {$add : ["$value1", "$value2", "$value3"]}}},
{$sort: {sum: -1}}
)
据我所知,MongoDB中没有类似于按条件排序的选项。默认情况下,也没有将所有字段添加到项目中的选项。这是一个问题,但尚未解决

现在,另一个选项是创建新字段(例如:totalValues),并在值字段更改时将总和存储在该字段中。然后,您可以按总值排序

您可以使用引用根文档。将此文档的所有字段保存在字段中,并尝试在该字段之后获取(取决于客户端系统:java、C++、…)< /p> 您可以使用引用根文档。将此文档的所有字段保存在字段中,并尝试在该字段之后获取(取决于客户端系统:java、C++、…)< /p>
其中,$project:需要指定要传递的字段,$addFields将返回所有字段并添加或替换指定字段

db.someCollection.aggregate(
    {
        $addFields: {
            sum: { $add: [ "$value1", "$value2", "$value3" ] }
        },
        $sort: {
            sum: -1
        }
    }
)
将完全实现你想要的


请注意,此功能是在Mongo版本3.4中添加的。

其中$project:需要指定要传递的字段,$addFields将返回所有字段并添加或替换指定字段

db.someCollection.aggregate(
    {
        $addFields: {
            sum: { $add: [ "$value1", "$value2", "$value3" ] }
        },
        $sort: {
            sum: -1
        }
    }
)
将完全实现你想要的


请注意,此功能是在Mongo版本3.4中添加的。

要恢复数据库中的文档,您可以使用操作符:

db.someCollection.aggregate(
    [
        {
            $project: {
                sum: { $add: [ "$value1", "$value2", "$value3" ] },
                document: "$$ROOT"
            }
        },
        {
            $sort: { sum: -1 }
        },
        {
            $replaceRoot : {newRoot : "$document"}
        }
    ]
)
结果是:

{
    "_id" : ObjectId("58f0d4777bde783e55e3410b"),
    "name" : "John Doe",
    "address" : "Some cool address",
    "value1" : 2,
    "value2" : 3,
    "value3" : 5
}

{
    "_id" : ObjectId("58f0d4c77bde783e55e3411e"),
    "name" : "Jane Doe",
    "address" : "Some cool address",
    "value1" : 1,
    "value2" : 3,
    "value3" : 2
}

要恢复数据库中的文档,可以使用操作符:

db.someCollection.aggregate(
    [
        {
            $project: {
                sum: { $add: [ "$value1", "$value2", "$value3" ] },
                document: "$$ROOT"
            }
        },
        {
            $sort: { sum: -1 }
        },
        {
            $replaceRoot : {newRoot : "$document"}
        }
    ]
)
结果是:

{
    "_id" : ObjectId("58f0d4777bde783e55e3410b"),
    "name" : "John Doe",
    "address" : "Some cool address",
    "value1" : 2,
    "value2" : 3,
    "value3" : 5
}

{
    "_id" : ObjectId("58f0d4c77bde783e55e3411e"),
    "name" : "Jane Doe",
    "address" : "Some cool address",
    "value1" : 1,
    "value2" : 3,
    "value3" : 2
}


嗯,是的,那会有用,但如果文档有20个字段,我不想显式地枚举20个字段。。。必须有某种普遍的解决办法。我只需要在顶部添加
sum
字段,而不更改重新添加的答案解释。我担心没有简单的解决方案。。。奇怪的是,拥有我需要的功能似乎是合法的。Thanx无论如何,自从Mongo3.4以来,有更好的解决方案使用$addFields,请检查Franz Kirkmanwell的答案是的,这会起作用,但如果文档有20个字段,我不想显式枚举20个字段。。。必须有某种普遍的解决办法。我只需要在顶部添加
sum
字段,而不更改重新添加的答案解释。我担心没有简单的解决方案。。。奇怪的是,拥有我需要的功能似乎是合法的。Thanx无论如何,自从Mongo3.4以来,使用$addFields有更好的解决方案,请检查Franz KirkmanI的答案。我认为答案是对问题的更好答案,尽管文档创建了一个文档字段。有没有办法不使用这个字段?我认为答案是这个问题的更好答案,尽管文档创建了一个文档字段。有没有办法不使用此字段?这很聪明,但由于$replaceRoot在Mongo 3.4或更高版本中可用,因此还有$addFields,它完全符合op的要求。所以不需要这种变通办法。@ukaszMazan没错。这个操作符在其他情况下更合适。我喜欢你的解决方案。更干净的一个,因为它使字段恢复正常,没有额外的字段名。这是聪明的,但由于$replaceRoot在Mongo 3.4或更高版本中可用,还有$addFields,它完全符合op的要求。所以不需要这种变通办法。@ukaszMazan没错。这个操作符在其他情况下更合适。我喜欢你的解决方案。更干净的一个,因为它把字段恢复正常,没有额外的字段名。这个解决方案很好,但它似乎没有正确的格式。像
$sort
应该在嵌套对象中,我想谢谢@KeitelDOG,这是很久以前的事了,但这在我的项目中起作用。这个解决方案很好,但似乎格式不正确。比如,
$sort
应该在嵌套对象中,我想谢谢@KeitelDOG,这是很久以前的事了,但这在我的项目中起作用。