MongoDB пакетного получения для DataLoader - PullRequest
0 голосов
/ 31 января 2020

Я действительно решил эту проблему, однако, разместив здесь вопрос, надеясь, что кто-то найдет решение полезным. Я искал чисто запрос / агрегацию MongoDB, которая служила бы в качестве пакетного сборщика для DataBoader FB. После этого я не хотел .map() на сервере, поэтому результатом запроса должен был быть объект, ключами которого были идентификаторы, а значениями были сами документы.

1 Ответ

0 голосов
/ 31 января 2020
const resMapArr = db.SOMECOLLECTION.aggregate([{
        $match : {
            _id: { $in: _ids }
        }
      }, {
        $group: {
            _id: null, 
            docs: { $push: "$$ROOT" }
        }
      }, {
        $project: {
          res: {
            $arrayToObject: {
              $map: {
                input: "$docs",
                as: "el",
                in: {
                  k: { $convert: { input: "$$el._id", to: "string" }},
                  v: "$$el"
                }
              }
            }
          }
        }
      }, {
        $replaceRoot: { newRoot: "$res" }
      } 
    ])
const resMap = resMapArr[0];

Таким образом, вы можете вернуть результаты в пакетной функции DataLoader как:

return _ids.map(id => resMap[id.toHexString()] || null);
...