Сортировать по глубокой области документа в MongoDb - PullRequest
1 голос
/ 27 марта 2019

У меня есть коллекция с именем 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").

.

1 Ответ

1 голос
/ 27 марта 2019

Проблема здесь в том, что с помощью $ unwind вы изменяете исходную структуру ваших документов (вы получите один документ на chats. Я бы предложил использовать $ map , чтобы получить массив весов на основе указанного ИД пользователя, а затем вы можете использовать $ max , чтобы получить окончательный weight

db.col.aggregate([
    { $match: {'event._id':ObjectId('5c942a3591deb389bfd92579'), 'chats.enabled': {$exists: true}}},
    { 
        "$project": {
            "_id": 1,
            "chats.user._id": 1,
            "weight": {
                $max: { $map: { input: "$chats", in: { $cond: [ { $eq: [ "$$this.user._id", ObjectId("5c942a3591deb389bfd92579") ] }, 10, 0  ] } } }
            }
        }
    },
    { "$sort": { "weight": -1 } },
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...