Arrays 在文档数组中的子文档中按字段排序?
我有如下文件:Arrays 在文档数组中的子文档中按字段排序?,arrays,mongodb,mongodb-query,Arrays,Mongodb,Mongodb Query,我有如下文件: { _id: 1, Sc: [ { Ts: ISODate("2017-01-01T10:00:00.000+0000"), Sc: 1 }, { Ts: ISODate("2017-01-02T10:00:00.000+0000"), Sc: 2 }, { Ts: ISODate("2017-01-03T10:00:00.000+0000"), Sc: 3
{
_id: 1,
Sc: [
{
Ts: ISODate("2017-01-01T10:00:00.000+0000"),
Sc: 1
},
{
Ts: ISODate("2017-01-02T10:00:00.000+0000"),
Sc: 2
},
{
Ts: ISODate("2017-01-03T10:00:00.000+0000"),
Sc: 3
},
]
},
{
_id: 2,
Sc: [
{
Ts: ISODate("2017-01-01T10:00:00.000+0000"),
Sc: 100
},
{
Ts: ISODate("2017-01-02T10:00:00.000+0000"),
Sc: 200
},
{
Ts: ISODate("2017-01-03T10:00:00.000+0000"),
Sc: 300
},
]
},
{
_id: 3,
Sc: [
{
Ts: ISODate("2017-01-01T10:00:00.000+0000"),
Sc: 1
},
{
Ts: ISODate("2017-01-02T10:00:00.000+0000"),
Sc: 2
},
{
Ts: ISODate("2017-01-03T10:00:00.000+0000"),
Sc: 3000
},
]
}
我想对Sc数组中最后一个元素上的文档进行排序(按TS,不一定是物理上最后一个元素)的Sc字段,降序排列。因此,生成的文档应该与上面的示例相反(id为3,2,1)。您可以使用聚合和
$unwind
来执行数组解构。
然后,您可以选择minTs并按minTs desc排序
db.colls.aggregate([
{$unwind:{路径:$Sc},
{$group:{{{u id:'${u id',minTs:{$min:'$Sc.Ts'}},
{$sort:{minTs:-1}}
])
{u id:3,“minTs:ISODate”(“2017-01-01T10:00:00Z”)}
{“_id”:2,“minTs”:ISODate(“2017-01-01T10:00:00Z”)}
{“_id”:1,“minTs”:ISODate(“2017-01-01T10:00:00Z”)}
使用此解决方案,您将丢失初始Sc阵列,但传输时它将更轻
如果您想保留它,您可以使用以前的$project
将Sc保存在初始值中,并在末尾的其他$project
中使用它:
db.colls.aggregate([{
$project:{Sc:1,缩写Sc:'$Sc'}},
{$unwind:{路径:$Sc},
{$group:{{{u id:{{u id:'$\u id',Sc:'$initialSc'},minTs:{$min:'$Sc.Ts'}},
{$sort:{minTs:-1}},
{$project:{{{u id:'$\u id.{u id',Sc:'$\u id.Sc'}}}])
{u id:3,“Sc”:[
{“Ts”:ISODate(“2017-01-01T10:00:00Z”),“Sc”:1},
{“Ts”:ISODate(“2017-01-02T10:00:00Z”),“Sc”:2},
{“Ts”:ISODate(“2017-01-03T10:00:00Z”),“Sc”:3000}
] }
{“_id”:2,“Sc”:[
{“Ts”:ISODate(“2017-01-01T10:00:00Z”),“Sc”:100},
{“Ts”:ISODate(“2017-01-02T10:00:00Z”),“Sc”:200},
{“Ts”:ISODate(“2017-01-03T10:00:00Z”),“Sc”:300}
] }
{“_id”:1,“Sc”:[
{“Ts”:ISODate(“2017-01-01T10:00:00Z”),“Sc”:1},
{“Ts”:ISODate(“2017-01-02T10:00:00Z”),“Sc”:2},
{“Ts”:ISODate(“2017-01-03T10:00:00Z”),“Sc”:3}
] }