MongoDB, Как мне объединить поиск и сортировку с $ cond в агрегации? - PullRequest
1 голос
/ 24 марта 2020

Я написал запрос поиска, который работает, запрос поиска возвращает записи, в которых существуют имя и уровень

db.docs.find( { $and: [{name:{$exists:true}},{level:{ $exists:true}} ] },{_id:0, name:1}).sort({"name":1})

и теперь хочу объединить его с чем-то вроде приведенного ниже кода, который также работает, но нуждается в необходимо объединить с вышеприведенным, чтобы получить правильные данные

db.docs.aggregate(
   [
      {
         $project:
           {
             _id:0,
             name: 1,
             Honours:
               {
                 $cond: { if: { $gte: [ "$level", 8 ] }, then: "True", else: "False" }
               }
           }
      }
   ]
)

Запрос поиска возвращает записи, в которых существуют имя и уровень, но мне нужно улучшить результат с помощью нового столбца с именем Honors, показывающего True of False в зависимости от является ли уровень gte (больше или равен 8)

Так что я в основном пытаюсь объединить вышеупомянутый фильтр поиска с функцией $ cond (которую я нашел и изменил пример здесь: $ cond )

Я попробовал приведенные ниже и несколько других перестановок, чтобы попытаться найти и отсортировать с помощью $ project и $ cond aggregate, но он вернул ошибки. Я просто очень плохо знаком с тем, как создать синтаксис mongodb, чтобы все это сочеталось. Может кто-нибудь помочь, пожалуйста?

db.docs.aggregate(
   [{{ $and: [{name:{$exists:true}},{level:{ $exists:true}} ] },{_id:0, name:1}).sort({"name":1}
      {
         $project:
           {
             _id:0,
             name: 1,
             Honours:
               {
                 $cond: { if: { $gte: [ "$level", 8 ] }, then: "True", else: "False" }
               }
           }
      }
}
   ]
)

1 Ответ

0 голосов
/ 24 марта 2020

Попробуйте использовать конвейер агрегации:

db.docs.aggregate([
  /** $match is used to filter docs kind of .find(), lessen the dataset size for further stages */
  {
    $match: {
      $and: [{ name: { $exists: true } }, { level: { $exists: true } }]
    }
  },
  /** $project works as projection - w.r.t. this projection it will lessen the each document size for further stages */
  {
    $project: {
      _id: 0,
      name: 1,
      Honours: {
        $cond: { if: { $gte: ["$level", 8] }, then: "True", else: "False" }
      }
    }
  },
  /** $sort should work as .sort() */
  { $sort: { name: 1 } }
]);
...