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}
] }