Mongo - сортировка после проекта $ не работает

У меня три коллекции - статьи, категории и пользователи. Каждая статья может иметь автора и соавтора, и я хотел бы перечислить данные текущего пользователя - это может быть имя пользователя или псевдоним, потому что пользователи могут использовать два разных типа. У меня есть агрегация для этого, и она работает нормально, но $ sort с использованием проецируемого столбца currentUser недействителен - да, он сортирует "что-то", но не уверен, что, потому что "aaa" в начале, затем "Test" и в конце это ... «Второй тест». Должен быть посередине.

Я использую внутри него $ project и $ cond, чтобы получить - сначала конкретного автора, используя текущий идентификатор пользователя, затем имя пользователя или псевдоним. Результаты в порядке, только сортировка нарушена.

КСТАТИ. Это лучший способ получить только одну запись из поиска вместо использования $ arrayElemAt?

[ { '$match': <MY CONDITIONS> },
  { '$lookup': 
     { from: 'categories',
       localField: 'category',
       foreignField: '_id',
       as: 'categories' } },
  { '$lookup': 
     { from: 'users',
       localField: 'author',
       foreignField: '_id',
       as: 'author' } },
  { '$lookup': 
     { from: 'users',
       localField: 'subauthor',
       foreignField: '_id',
       as: 'subauthor' } },
  { '$project': 
    { _id: 1,
       name: 1,
       status: 1,
       updatedAt: 1,
       currentUser: {
          '$cond': {
            'if': { '$eq': [ userId, '$creator'] },
            'then': {
              '$cond': {
                'if': { '$eq': [ '', {'$arrayElemAt': ['$author.username', 0]} ] },
                'then': {'$arrayElemAt': ['$author.nickname', 0]},
                'else': {'$arrayElemAt': ['$author.username', 0]}
              }
            },
            'else': {
              '$cond': {
                'if': { '$eq': [ '', {'$arrayElemAt': ['$subauthor.username', 0]} ] },
                'then': {'$arrayElemAt': ['$subauthor.nickname', 0]},
                'else': {'$arrayElemAt': ['$subauthor.username', 0]}
              }
            }
          }
        },
    } 
  },
  { '$sort': { currentUser: 1 } }
]

Что этот конвейер выводит без $sort?

dnickless 17.07.2018 16:02
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
1
202
1

Ответы 1

Я нашел решение - это было из-за отсутствия сопоставления. Добавлен с locale en_US / force = 1, и теперь он работает нормально.

Другие вопросы по теме