Изменить совокупный результат

#javascript #mongodb #mongoose

#javascript #mongodb #мангуст

Вопрос:

В настоящее время у меня есть почти рабочий агрегированный запрос, который получит users массив и упорядочит объекты там по их score . Но не получая ожидаемого результата, по какой-то причине все family данные печатаются снова.

Как мне это исправить?

Выполняемый код:

    return Family.aggregate([
            // Initial document match (uses index, if a suitable one is available)
            { $match: {name: 'Management'}},

            // Expand the scores array into a stream of documents
            { $unwind: '$users' },

            // Sort in descending order
            { $sort: {
                    'users.score': -1
                }}]
  

Текущий результат:

 { _id: 5c8e5c79e55ef42ce4923e0b,
    name: 'Management',
    time_started: 1552833657354,
    location: 1,
    isFamily: true,
    last_member: 0,
    score: 0,
    users:
     { userid: '5c852292d1bd911abc4957dc',
       joined_date: 1552839246371,
       permission: 5,
       upgrade: 0,
       score: 141,
       _id: 5c8e724e6e5e6512447c1a61 },
    __v: 0 },
  { _id: 5c8e5c79e55ef42ce4923e0b,
    name: 'Management',
    time_started: 1552833657354,
    location: 1,
    isFamily: true,
    last_member: 0,
    score: 0,
    users:
     { userid: '5c8522a96bcca9268c0753fe',
       joined_date: 1552833657354,
       permission: 6,
       upgrade: 0,
       score: 32,
       _id: 5c8e5c79e55ef42ce4923e0c },
    __v: 0 } ]
  

требуемый результат:

 {
  name: 'Management',
    time_started: 1552833657354,
    location: 1,
    isFamily: true,
    last_member: 0,
    score: 0,
users:
     [{ userid: '5c852292d1bd911abc4957dc',
       joined_date: 1552839246371,
       permission: 5,
       upgrade: 0,
       score: 141,
       _id: 5c8e724e6e5e6512447c1a61 },
    __v: 0 },


{ userid: '5c8522a96bcca9268c0753fe',
   joined_date: 1552833657354,
   permission: 6,
   upgrade: 0,
   score: 32,
   _id: 5c8e5c79e55ef42ce4923e0c },
__v: 0 }
]}
  

Ответ №1:

Вам нужно использовать еще один $group этап, чтобы преобразовать разделенный массив в его первоначальную форму после $unwind

 Family.aggregate([
  { "$match": { "name": "Management" }},
  { "$unwind": "$users" },
  { "$sort": { "users.score": -1 }},
  { "$group": {
    "_id": "$_id",
    "users": { "$push": "$users" },
    "name": { "$first": "$name" },
    "time_started": { "$first": "$time_started" },
    "isFamily": { "$first": "$isFamily" },
    "last_member": { "$first": "$last_member" },
    "score": { "$first": "$score" },
  }}
])
  

Комментарии:

1. Большое спасибо, принял ответ. если вы хотите, у меня есть вопрос, еще вопрос id 55208885