0

我实际上解决了这个问题,但是,在这里发布一个问题,希望有人会发现这个解决方案很有用。我正在寻找一个纯粹的 MongoDB 查询/聚合,它可以作为 FB 的 DataLoader 的批处理获取器。后来我不想.map()在服务器上,所以查询结果必须是一个对象,键是 id,值是文档本身。

4

1 回答 1

0
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);
于 2020-01-31T09:40:21.460 回答