4 votes

Faire le travail de $sort pour le document sub array

J'ai une collection qui a un champ de type tableau. Je veux trier sur la base d'un champ de sous-réseau mais Mongo ne trie pas les données.

Ma collection est :

{
  "_id" : ObjectId("51f1fcc08188d3117c6da351"),
  "cust_id" : "abc123",
  "ord_date" : ISODate("2012-10-03T18:30:00Z"),
  "status" : "A",
  "price" : 25,
  "items" : [{
      "sku" : "ggg",
      "qty" : 7,
      "price" : 2.5
    }, {
      "sku" : "ppp",
      "qty" : 5,
      "price" : 2.5
    }]
}

Ma question est la suivante :

db.orders.aggregate([
  { "$unwind" : "$items"} , 
  { "$match" : { }} , 
  { "$group" : { "items" : { "$addToSet" : { "sku" : "$items.sku"}} , "_id" : { }}} , 
  { "$sort" : { "items.sku" : 1}} ,
  { "$project" : { "_id" : 0 , "items" : 1}}
])

Le résultat est :

    "result" : [
            {
                    "items" : [
                            {
                                    "sku" : "ppp"
                            },
                            {
                                    "sku" : "ggg"
                            }
                    ]
            }
    ],
    "ok" : 1

}

Considérant que "sku":"ggg" doit venir en premier lorsqu'elle est ascendante.

4voto

Sammaye Points 21778

Vous devez faire le tri AVANT de vous regrouper :

db.orders.aggregate([ 
    { "$unwind" : "$items"} , 
    { "$sort" : { "items.sku" : 1}}, 
    { "$match" : { }} , 
    { "$group" : { "items" : { "$push" : { "sku" : "$items.sku"}} , "_id" : null}} ,
    { "$project" : { "_id" : 0 , "items" : 1}}
])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X