Как правильно вывести массив объектов в обратном порядке из mongodb? - PullRequest
0 голосов
/ 28 января 2020

Комментарии сохраняются в массиве объектов. Как я могу правильно вывести их в обратном порядке (комментарии от самого нового к самому старому)?

My db:

{"_id":{"$oid":"5e3032f14b82d14604e7cfb7"},
"videoId":"zX6bZbsZ5sU",
"message":[
    {"_id":{"$oid":"5e3032f14b82d14604e7cfb8"},
    "user":{"$oid":"5e2571ba388ea01bcc26bc96"},"text":"1"
    },
     {"_id":{"$oid":"5e3032f14b82d14604e7cfb9"},
    "user":{"$oid":"5e2571ba388ea01bcc26bc96"},"text":"2"
    },
    ....
    ]

My sheme Mon goose:

const schema = new Schema({
videoId: { type: String, isRequired: true },
message: [
{
  user: { type: Schema.Types.ObjectId, ref: 'User' },
  text: { type: String }
},

]
});

Мой код:

const userComments = await Comment.find(
  { videoId: req.query.videoId },
  { message: { $slice: [skip * SIZE_COMMENT, SIZE_COMMENT] } }
)
  .sort({ message: -1 })
  .populate('message.user', ['avatar', 'firstName']);

но сортировка не работает;

заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Вы можете просто использовать $ reverseArray для обращения содержимого массива.

db.collection.aggregate([
   {
     $addFields:
      {
         message: { $reverseArray: "$message" }
      }
   }
])

Сбор данных:

/* 1 */
{
    "_id" : ObjectId("5e3032f14b82d14604e7cfb7"),
    "videoId" : "zX6bZbsZ5sU",
    "message" : [ 
        {
            "_id" : ObjectId("5e3032f14b82d14604e7cfb8"),
            "user" : ObjectId("5e2571ba388ea01bcc26bc96"),
            "text" : "1"
        }, 
        {
            "_id" : ObjectId("5e3032f14b82d14604e7cfb9"),
            "user" : ObjectId("5e2571ba388ea01bcc26bc96"),
            "text" : "2"
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5e309318d02e05b694b0b25f"),
    "videoId" : "zX6bZbsZ5sUNEWWWW",
    "message" : [ 
        {
            "_id" : ObjectId("5e3032f14b82d14604e7cfc9"),
            "user" : ObjectId("5e2571ba388ea01bcc26bc87"),
            "text" : "Old"
        }, 
        {
            "_id" : ObjectId("5e3032f14b82d14604e7cfd0"),
            "user" : ObjectId("5e2571ba388ea01bcc26bc87"),
            "text" : "New"
        }
    ]
}

Результат:

/* 1 */
{
    "_id" : ObjectId("5e3032f14b82d14604e7cfb7"),
    "videoId" : "zX6bZbsZ5sU",
    "message" : [ 
        {
            "_id" : ObjectId("5e3032f14b82d14604e7cfb9"),
            "user" : ObjectId("5e2571ba388ea01bcc26bc96"),
            "text" : "2"
        }, 
        {
            "_id" : ObjectId("5e3032f14b82d14604e7cfb8"),
            "user" : ObjectId("5e2571ba388ea01bcc26bc96"),
            "text" : "1"
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5e309318d02e05b694b0b25f"),
    "videoId" : "zX6bZbsZ5sUNEWWWW",
    "message" : [ 
        {
            "_id" : ObjectId("5e3032f14b82d14604e7cfd0"),
            "user" : ObjectId("5e2571ba388ea01bcc26bc87"),
            "text" : "New"
        }, 
        {
            "_id" : ObjectId("5e3032f14b82d14604e7cfc9"),
            "user" : ObjectId("5e2571ba388ea01bcc26bc87"),
            "text" : "Old"
        }
    ]
}

Ваш запрос: Вы можете использовать $ lookup встроенного MongoDB вместо .populate(), поэтому попробуйте ниже:

Comments.aggregate([
    {
        $addFields:
        {
            message: { $reverseArray: "$message" }
        }
    }, {
        $lookup: {
            from: "User",
            let: { ids: "$message.user" },
            pipeline: [
                {
                    $match: { $expr: { $in: ["$_id", "$$ids"] } }
                },
                { $project: { avatar: 1, firstName: 1, _id: 0 } }
            ],
            as: "userData"
        }
    }
])
0 голосов
/ 28 января 2020

Вы захотите использовать одну из двух вещей:

  1. Структура агрегации MongoDB
  2. Сортировка в приложении

Если вы Если вы решите использовать платформу агрегации MongoDB, вам, вероятно, понадобится использовать операцию $unwind, чтобы развернуть массив в отдельные документы, а затем отсортировать эти документы с помощью операции $sort.

Подробнее об этом как сделать это в этом билете:

как отсортировать массив внутри записи коллекции в mongoDB

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

Best,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...