У меня есть коллекция с именем Visitor, в которой есть массив чатов, и у каждого массива есть документ с именем user.
Мне нужно найти несколько документов в этой коллекции и отсортировать их, если у них есть какой-то конкретный пользователь в своих чатах..
Путь для идентификатора пользователя:
chats.user._id
где:
chats // array
user // document
_id // ObjectId
Приведенный ниже скрипт выполняет правильную сортировку документов, однако онрасширяет массив чатов и умножает документ для каждого чата в массиве.
Мне нужна только сортировка, поэтому я могу отсортировать и не использовать конвейер unwind
или сделать так, чтобы документы не умножались?
db.getCollection('Visitor').aggregate([
{$unwind: "$chats"},
{ $match: {'event._id':ObjectId('5c942a3591deb389bfd92579'), 'chats.enabled': {$exists: true}}},
{
"$project": {
"_id": 1,
"chats.user._id": 1,
"weight": {
"$cond": [
{ "$eq": [ "$chats.user._id", ObjectId("5c942a3591deb389bfd92579") ] },
10,
0
]
}
}
},
{ "$sort": { "weight": -1 } },
])
РЕДАКТИРОВАТЬ: мне не нужно сортировать внутренний массив, но сортировать команду поиска, проверяя, есть ли конкретный пользователь в массиве чатов.
Некоторые примеры коллекции Visitor:
[
{
"_id" : ObjectId("5c9a3a1bd86e0ba64106e90e"),
"event" : {
"_id" : ObjectId("5c942a3591deb389bfd92579")
},
"chats" : [
{
"enabled" : false,
"user" : {
"_id" : ObjectId("5c81232f09a923b559763418")
},
"_id" : ObjectId("5c9a3a1bd86e0ba64106e915")
}
]
},
{
"_id" : ObjectId("5c9a3a35d86e0ba64106e950"),
"event" : {
"_id" : ObjectId("5c942a3591deb389bfd92579")
},
"chats" : [
{
"enabled" : true,
"user" : {
"_id" : ObjectId("5c81232f09a923b559763418")
},
"_id" : ObjectId("5c9a3a35d86e0ba64106e957")
},
{
"enabled" : true,
"user" : {
"_id" : ObjectId("5c942a3591deb389bfd92579")
},
"_id" : ObjectId("5c9a3a34d86e0ba64106e91d")
}
]
}
]
В приведенном выше примере мне нужно сначала отсортировать второй документ, потому что у него есть пользователь с _id ObjectId("5c942a3591deb389bfd92579")
.
.