Я хочу иметь возможность возвращать список сообщений, динамически отсортированных по тому, пометил ли просматривающий веб-пользователь сообщение со значением важности 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")
}
]
}