Aggregate Mon go - сортировка внутри массива объекта по одному из его значений - PullRequest
0 голосов
/ 20 апреля 2020

Я использую агрегат для выполнения некоторых операций, фильтров и сортировки. Проблема в том, что мне нужно отсортировать (кроме основной сортировки) элементы (объекты) внутри массива по одному из его значений. Я не хочу сортировать окончательный результат по этому массиву, мне просто нужно отсортировать массив. Итак, после поиска изображений мне нужно отсортировать изображения по «imageName», а затем продолжить операцию.

В результате изображения отображаются следующим образом: я хочу, чтобы они отображались в правильном порядке, в зависимости от поля «imageName»

 "images": [
                {
                    "_id": "5e9cd8f5207ef0c1687da948",
                    "cloudImage": "https:...",
                    "imageName": "image2",
                    "__v": 0,
                    "createdAt": "2020-04-19T23:04:21.582Z",
                    "updatedAt": "2020-04-19T23:04:21.582Z"
                },
                {
                    "_id": "5e9cd8f5207ef0c1687da949",
                    "cloudImage": "https:...",
                    "imageName": "image0",
                    "__v": 0,
                    "createdAt": "2020-04-19T23:04:21.583Z",
                    "updatedAt": "2020-04-19T23:04:21.583Z"
                },
                {
                    "_id": "5e9cd8f5207ef0c1687da94a",
                    "cloudImage": "https:...",
                    "imageName": "image1",
                    "__v": 0,
                    "createdAt": "2020-04-19T23:04:21.584Z",
                    "updatedAt": "2020-04-19T23:04:21.584Z"
                }
            ],

Это агрегация:

  let query = Shirt
            .aggregate([
                {
                    $lookup: {
                        from: Team.collection.name,
                        localField: 'team',
                        foreignField: '_id',
                        as: 'team',
                    },
                },
                {
                    $lookup: {
                        from: Comment.collection.name,
                        localField: 'comments',
                        foreignField: '_id',
                        as: 'comments',
                    },
                },
                {
                    $lookup: {
                        from: Image.collection.name,
                        localField: 'images',
                        foreignField: '_id',
                        as: 'images',
                    },
                },
                {
                    $addFields: { totalLikes: { "$size": "$likes" } }
                },
                {
                    $unwind: '$team'
                },
                {
                    $match: filters
                },
                {
                    $sort: sorted
                },
                {
                    "$project": {
                        "team": 1,
                        "title": 1,
                        "comments": 1,
                        "size": 1,
                        "year": 1,
                        "brand": 1,
                        "code": 1,
                        "description": 1,
                        "isLikedByUser": 1,
                        "isHome": 1,
                        "isFan": 1,
                        "images": 1,
                        "shirtUser": 1,
                        "likes": 1,
                        "createdAt": 1,
                        "updatedAt": 1
                    },
                },
            ])
            .collation({ locale: "es" })

1 Ответ

0 голосов
/ 20 апреля 2020

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

Пожалуйста, обратитесь к ниже для получения более подробной информации: внутренний массив сортировки Mongodb

...