2013-03-27 7 views
2

Je tente de trier certains documents en fonction de la date d'un document incorporé. Mes documents ressemble à:Trier par document incorporé

[ 
    { 
     name: 'item1', 
     slots: [ 
      { 
       date : ISODate("2013-01-18T23:00:00Z") 
      }, 
      { 
       date : ISODate("2013-02-05T23:00:00Z") 
      }, 
      { 
       date : ISODate("2013-03-24T23:00:00Z") 
      }, 
     ] 
    }, 
    { 
     name: 'item2', 
     slots: [ 
      { 
       date : ISODate("2013-01-12T23:00:00Z") 
      }, 
      { 
       date : ISODate("2013-01-03T23:00:00Z") 
      }, 
      { 
       date : ISODate("2013-03-04T23:00:00Z") 
      }, 
     ] 
    }, 
    { 
     name: 'item3', 
     slots: [ 
      { 
       date : ISODate("2013-03-14T23:00:00Z") 
      }, 
      { 
       date : ISODate("2013-02-18T23:00:00Z") 
      }, 
      { 
       date : ISODate("2013-03-07T23:00:00Z") 
      }, 
     ] 
    } 
] 

J'ai besoin du résultat ordonné par slots.date ascendant. Donc, résultat devrait ressembler à:

[ 
    { 
     name: 'item2', 
     slots: [ 
      { 
       date : ISODate("2013-01-03T23:00:00Z") 
      }, 
      { 
       date : ISODate("2013-01-12T23:00:00Z") 
      },    
      { 
       date : ISODate("2013-03-04T23:00:00Z") 
      }, 
     ] 
    }, 
    { 
     name: 'item1', 
     slots: [ 
      { 
       date : ISODate("2013-01-18T23:00:00Z") 
      }, 
      { 
       date : ISODate("2013-02-05T23:00:00Z") 
      }, 
      { 
       date : ISODate("2013-03-24T23:00:00Z") 
      }, 
     ] 
    },  
    { 
     name: 'item3', 
     slots: [ 
      { 
       date : ISODate("2013-02-18T23:00:00Z") 
      }, 
      { 
       date : ISODate("2013-03-07T23:00:00Z") 
      }, 
      { 
       date : ISODate("2013-03-14T23:00:00Z") 
      } 
     ] 
    } 
] 

Première item2, becouse il contient la plus ancienne slot.date (ISODate ("2013-01-03T23: 00: 00Z")). Deuxième item1 parce qu'il contient la deuxième date la plus ancienne (ISODate ("2013-01-18T23: 00: 00Z")) et ainsi de suite .... est-il également possible de trier les dates dans le document incorporé?

Ce que j'ai essayé:

.sort({{slots.date : 1}}) 

Mais je reçois une erreur de syntaxe. J'utilise MongoVUE pour tester la requête, MongoVUE ne peut pas lancer le tri sur des documenten embarqués? C'est même possible ce que je veux faire?

Répondre

8

Le code montré:

.sort({{slots.date : 1}}) 

A une erreur de syntaxe. Vous avez deux crochets dans votre code, il devrait être:

.sort({slots.date : 1}) 

Il y a aussi deux façons de trier vos sous-documents internes. Peut-être que côté client est la méthode la plus rapide ici mais vous pouvez également utiliser le cadre d'agrégation si elle prouve que faire nativement au sein de MongoDB lui-même est plus rapide:

db.col.aggregate([ 
    {$unwind: '$slots'}, 
    {$sort: {slots.date:1}}, 
    {$group: {_id: '$_id', slots: {$push: '$slots'}} 
]) 

Quelque chose comme ça triera les sous-documents.

Questions connexes