Сортировка коллекции MongoDB по одному значению в (запрошенном) массиве поддокументов - PullRequest
0 голосов
/ 19 июня 2020

Я хочу иметь возможность возвращать список сообщений, динамически отсортированных по тому, пометил ли просматривающий веб-пользователь сообщение со значением важности 1-5 (стикеры), а затем по дате создания (по убыванию) сообщений. Сообщение может быть отмечено любым количеством пользователей как важное для них. Данные находятся в одной коллекции:

{
    "_id" : ObjectId("5ee1b4861161021f4478731e"),
    "title" : "title 1",
    "content" : "Some text",
    "user" : ObjectId("5ed5bafbddf899367ca015a7"),
    "createdDate" : ISODate("2020-06-11T14:35:18.190+10:00"),
    "updatedDate" : ISODate("2020-06-18T20:42:46.060+10:00"),
    "stickies" : [ ]
},
{
    "_id" : ObjectId("5ee2257d1c6cc21c68ac5db5"),
    "title" : "title 2",
    "content" : "Some text",
    "user" : ObjectId("5ed5bafbddf899367ca015a7"),
    "createdDate" : ISODate("2020-06-11T22:37:17.014+10:00"),
    "updatedDate" : ISODate("2020-06-18T10:56:29.299+10:00"),
    "stickies" : [ ]
},
{
    "_id" : ObjectId("5ee94aaba35e1c19e85cd5a4"),
    "title" : "title 3",
    "content" : "Some text",
    "user" : ObjectId("5ed5bafbddf899367ca015a7"),
    "createdDate" : ISODate("2020-06-17T08:41:47.208+10:00"),
    "updatedDate" : ISODate("2020-06-18T11:23:38.180+10:00"),
    "stickies" : [ ]
},
{
    "_id" : ObjectId("5ee94b8ba35e1c19e85cd5a5"),
    "title" : "title 4",
    "content" : "Some text",
    "user" : ObjectId("5ed5bafbddf899367ca015a7"),
    "createdDate" : ISODate("2020-06-17T08:45:31.032+10:00"),
    "updatedDate" : ISODate("2020-06-18T12:16:16.242+10:00"),
    "stickies" : [
        {
            "_id" : ObjectId("5eeb711f7fdc81378c69c784"),
            "user" : ObjectId("5ed5bafbddf899367ca015a7"),
            "value" : 5,
            "createdDate" : ISODate("2020-06-18T23:50:23.908+10:00")
        }
    ]
},
{
    "_id" : ObjectId("5ee94e9ca35e1c19e85cd5a6"),
    "title" : "title 5",
    "content" : "Some text",
    "user" : ObjectId("5ed5bafbddf899367ca015a7"),
    "createdDate" : ISODate("2020-06-17T08:58:36.487+10:00"),
    "updatedDate" : ISODate("2020-06-18T23:48:37.977+10:00"),
    "stickies" : [
        {
            "_id" : ObjectId("5eeb71227fdc81378c69c785"),
            "user" : ObjectId("5ed5bafbddf899367ca015a7"),
            "value" : 3,
            "createdDate" : ISODate("2020-06-18T23:50:26.231+10:00")
        }
    ]
},
{
    "_id" : ObjectId("5eeb6739aad7bc29a81b3c33"),
    "title" : "title 6",
    "content" : "Some text",
    "user" : ObjectId("5ed5bafbddf899367ca015a7"),
    "createdDate" : ISODate("2020-06-18T23:08:09.639+10:00"),
    "updatedDate" : ISODate("2020-06-18T23:48:31.748+10:00"),
    "stickies" : [
        {
            "_id" : ObjectId("5eeb673eaad7bc29a81b3c34"),
            "user" : ObjectId("5ed5bafbddf899367ca015a7"),
            "value" : 5,
            "createdDate" : ISODate("2020-06-18T23:08:14.544+10:00")
        },
        {
            "_id" : ObjectId("5eeb7a857fdc81378c69c786"),
            "user" : ObjectId("5ee20ebd76244b2550c30abe"),
            "value" : 1,
            "createdDate" : ISODate("2020-06-19T00:30:29.891+10:00")
        }
    ]
}

Я написал запрос, который возвращает список сообщений, которые были отмечены липким значением для данного пользователя, но я не знаю, как подать заявку это возвращает полный список сообщений, использующих этот запрос в качестве основы для сортировки. В реляционной БД это был бы простой случай подзапросов и левых соединений, но это, насколько я понял:

db.posts.find({ "stickies.user": ObjectId("5ed5bafbddf899367ca015a7")}, { "_id": 1, "stickies.$": 1 }).sort({ "stickies.value": -1 })

Этот запрос возвращает:

{
        "_id" : ObjectId("5ee94b8ba35e1c19e85cd5a5"),
        "stickies" : [
                {
                        "_id" : ObjectId("5eeb711f7fdc81378c69c784"),
                        "user" : ObjectId("5ed5bafbddf899367ca015a7"),
                        "value" : 5,
                        "createdDate" : ISODate("2020-06-18T13:50:23.908Z")
                }
        ]
}
{
        "_id" : ObjectId("5eeb6739aad7bc29a81b3c33"),
        "stickies" : [
                {
                        "_id" : ObjectId("5eeb673eaad7bc29a81b3c34"),
                        "user" : ObjectId("5ed5bafbddf899367ca015a7"),
                        "value" : 5,
                        "createdDate" : ISODate("2020-06-18T13:08:14.544Z")
                }
        ]
}
{
        "_id" : ObjectId("5ee94e9ca35e1c19e85cd5a6"),
        "stickies" : [
                {
                        "_id" : ObjectId("5eeb71227fdc81378c69c785"),
                        "user" : ObjectId("5ed5bafbddf899367ca015a7"),
                        "value" : 3,
                        "createdDate" : ISODate("2020-06-18T13:50:26.231Z")
                }
        ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...