MongoDB: сортировка нескольких вложенных документов - PullRequest
2 голосов
/ 11 марта 2020

Я пытаюсь отсортировать мою коллекцию mon go в порядке возрастания. Но после выполнения моего кода результат не в порядке сортировки.

Моя коллекция Mon go равна

{
"_id" : ObjectId("5e60e61450c82e1abc7c82bd"),
"barId" : "5e55f10d8b54541278e9cb07",
"juices" : [ 
    {
        "_id" : 1,
        "mixerId" : 1,
        "mixerName" : "Tejuino",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 2,
        "mixerId" : 1,
        "mixerName" : "Izze",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 3,
        "mixerId" : 1,
        "mixerName" : "Kaffir lime",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 4,
        "mixerId" : 1,
        "mixerName" : "Limeade",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 5,
        "mixerId" : 1,
        "mixerName" : "Must",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 6,
        "mixerId" : 1,
        "mixerName" : "Pog",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 7,
        "mixerId" : 1,
        "mixerName" : "Petimezi",
        "price" : 0,
        "isActive" : 0
    }
],
"soda" : [ 
    {
        "_id" : 1,
        "mixerId" : 2,
        "mixerName" : "REGULAR SODA",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 2,
        "mixerId" : 2,
        "mixerName" : "Fanta Grape",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 3,
        "mixerId" : 2,
        "mixerName" : "Stewart's Black Cherry Wishniak",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 4,
        "mixerId" : 2,
        "mixerName" : "Dr. Brown's Black Cherry",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 5,
        "mixerId" : 2,
        "mixerName" : "A&W Cream",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 6,
        "mixerId" : 2,
        "mixerName" : "Mug Cream",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 7,
        "mixerId" : 2,
        "mixerName" : "A&W Root Beer",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 8,
        "mixerId" : 2,
        "mixerName" : "Mountain Dew",
        "price" : 0,
        "isActive" : 0
    }
],
"others" : [ 
    {
        "_id" : 1,
        "mixerId" : 3,
        "mixerName" : "GIN & BITTER LEMON",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 2,
        "mixerId" : 3,
        "mixerName" : "GIN & GINGER",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 3,
        "mixerId" : 3,
        "mixerName" : "GIN & VERMOUTH",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 4,
        "mixerId" : 3,
        "mixerName" : "GIN & LIME CORDIAL",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 5,
        "mixerId" : 3,
        "mixerName" : "GIN & GRAPEFRUIT",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 6,
        "mixerId" : 3,
        "mixerName" : "GIN & PINK LEMONADE",
        "price" : 0,
        "isActive" : 0
    }
]
}

Я хочу отсортировать вложенный документ по возрастанию на основе mixerName. Ниже приведен мой запрос mongodb

  db.getCollection('mixeritems').aggregate([
            { $match: { barId: '5e55f10d8b54541278e9cb07' }   },
            { $project: {
                juices: { $filter: {
                        input: "$juices",
                        as: "juices",
                        cond: { $eq: [ "$$juices.isActive", 1 ] }
                        } },
                soda: { $filter: {
                        input: "$soda",
                        as: "soda",
                        cond: { $eq: [ "$$soda.isActive", 1 ] }
                        } } ,       
                others: { $filter: {
                        input: "$others",
                        as: "others",
                        cond: { $eq: [ "$$others.isActive", 1 ] }
                        } }           
            },},
                            { $unwind: '$juices'},{ $unwind: '$soda'},{ $unwind: '$others'},
            { $sort : { 'juices.mixerName' : 1,"soda.mixerName" : 1,"others.mixerName" : 1 } },
            {$group:{
    _id: '$_id',
   juices: { $addToSet: "$juices"},
   soda: { $addToSet: "$soda"},
   others: { $addToSet: "$others"}
    }
}])

После исключения этого запроса, полученный мной результат приведен ниже:

  {
"_id" : ObjectId("5e60e61450c82e1abc7c82bd"),
"juices" : [ 
    {
        "_id" : 5,
        "mixerId" : 1,
        "mixerName" : "Must",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 4,
        "mixerId" : 1,
        "mixerName" : "Limeade",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 3,
        "mixerId" : 1,
        "mixerName" : "Kaffir lime",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 6,
        "mixerId" : 1,
        "mixerName" : "Pog",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 1,
        "mixerId" : 1,
        "mixerName" : "Tejuino",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 2,
        "mixerId" : 1,
        "mixerName" : "Izze",
        "price" : 0,
        "isActive" : 1
    }
],
"soda" : [ 
    {
        "_id" : 2,
        "mixerId" : 2,
        "mixerName" : "Fanta Grape",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 5,
        "mixerId" : 2,
        "mixerName" : "A&W Cream",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 6,
        "mixerId" : 2,
        "mixerName" : "Mug Cream",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 1,
        "mixerId" : 2,
        "mixerName" : "REGULAR SODA",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 3,
        "mixerId" : 2,
        "mixerName" : "Stewart's Black Cherry Wishniak",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 7,
        "mixerId" : 2,
        "mixerName" : "A&W Root Beer",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 4,
        "mixerId" : 2,
        "mixerName" : "Dr. Brown's Black Cherry",
        "price" : 0,
        "isActive" : 1
    }
],
"others" : [ 
    {
        "_id" : 3,
        "mixerId" : 3,
        "mixerName" : "GIN & VERMOUTH",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 2,
        "mixerId" : 3,
        "mixerName" : "GIN & GINGER",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 4,
        "mixerId" : 3,
        "mixerName" : "GIN & LIME CORDIAL",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 5,
        "mixerId" : 3,
        "mixerName" : "GIN & GRAPEFRUIT",
        "price" : 0,
        "isActive" : 1
    }, 
    {
        "_id" : 1,
        "mixerId" : 3,
        "mixerName" : "GIN & BITTER LEMON",
        "price" : 0,
        "isActive" : 1
     }
   ]
 }

Пожалуйста, помогите мне.

1 Ответ

1 голос
/ 11 марта 2020

Я заставил это работать, сортируя внутренние массивы отдельно. Самый красивый способ сортировки внутреннего массива - это ответ .

размотка -> сортировка -> группа -> замена Root

Итак все, что нам нужно сделать, это повторить эту логику c там раз для соков, соды и других массивов.

Детская площадка

db.getCollection('mixeritems').aggregate([
  {
    $match: {
      barId: "5e55f10d8b54541278e9cb07"
    }
  },
  {
    $project: {
      juices: {
        $filter: {
          input: "$juices",
          as: "juices",
          cond: {
            $eq: [
              "$$juices.isActive",
              1
            ]
          }
        }
      },
      soda: {
        $filter: {
          input: "$soda",
          as: "soda",
          cond: {
            $eq: [
              "$$soda.isActive",
              1
            ]
          }
        }
      },
      others: {
        $filter: {
          input: "$others",
          as: "others",
          cond: {
            $eq: [
              "$$others.isActive",
              1
            ]
          }
        }
      }
    }
  },
  {
    $unwind: "$juices"
  },
  {
    $sort: {
      "juices.mixerName": 1
    }
  },
  {
    "$group": {
      "_id": "$_id",
      "juices": {
        "$push": "$juices"
      },
      "doc": {
        "$first": "$$ROOT"
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$mergeObjects": [
          "$doc",
          {
            "juices": "$juices"
          }
        ]
      }
    }
  },
  {
    $unwind: "$soda"
  },
  {
    $sort: {
      "soda.mixerName": 1
    }
  },
  {
    "$group": {
      "_id": "$_id",
      "soda": {
        "$push": "$soda"
      },
      "doc": {
        "$first": "$$ROOT"
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$mergeObjects": [
          "$doc",
          {
            "soda": "$soda"
          }
        ]
      }
    }
  },
  {
    $unwind: "$others"
  },
  {
    $sort: {
      "others.mixerName": 1
    }
  },
  {
    "$group": {
      "_id": "$_id",
      "others": {
        "$push": "$others"
      },
      "doc": {
        "$first": "$$ROOT"
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$mergeObjects": [
          "$doc",
          {
            "others": "$others"
          }
        ]
      }
    }
  }
])
...