MongoDB获取所有字段+;按从多个字段计算的值排序
我需要从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
{
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,这是很久以前的事了,但这在我的项目中起作用。