Фильтровать, сортировать, ограничивать, пропускать поддокумент мангуста - PullRequest
0 голосов
/ 05 января 2019
const A = mongoose.Schema({
...
    bs: [B.schema],
...

 });

Так что в основном у меня есть две схемы, и одна является поддокументом другой. Из моих данных я получаю параметры. как фильтр, ограничение страницы, страница, сортировка ...

Что мне нужно сделать, так это создать запрос, который с _id из схемы A получит все его схемы B и всегда сортирует, ограничивает, пропускает, фильтрует с помощью параметров. что я отправил

Я пробовал что-то вроде этого

b = await A.find({'_id' : idA}, 
    { 'bs' : 
        { $slice: [ offset * limit, limit ]
        }
    }); 

И это работает, но я до сих пор не могу понять, как фильтровать и сортировать. Так что, если у кого-то есть идеи, можете поделиться.

P.S Извините за плохой английский С Уважением, Salesh

1 Ответ

0 голосов
/ 05 января 2019

То, что вы пытаетесь сделать, это не find Документы, которые соответствуют критериям вашего массива, но чтобы изменить результаты в соответствии с вашими потребностями. Это можно сделать двумя способами, в зависимости от того, где вы хотите выполнить обработку:

1. Использовать агрегацию MongoDB . Обработка производится в БД.

Конвейер агрегации представляет собой последовательность шагов, которые вы определяете, что документы проходят через запрос и преобразование. Грубый непроверенный (и, вероятно, синтаксически неправильный) пример будет:

A.aggregate([
  { $match: { _id: "id" }},
  { $project: {
      bs: {
        $filter: { input: "$bs" , as: "filteredBs" , cond: { /* conditions object */}  }},
     } 
  },    
  { $slice: ["$filteredBs", offset * limit, limit ] }
  /* ... */
]);

2. Получить документ по идентификатору и обработать массив на вашем сервере.

Здесь вы ограничены только возможностями javascript и его массива.

const found = A.findById('id');
const bs = A.bs.filter( /* filter function */ ).slice() // ... whatever you want.
A.bs = bs;
return A;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...