【问题标题】:Propper paginate a mongoose aggregate containing multible facets正确分页包含多个方面的 mongoose 聚合
【发布时间】:2020-12-20 01:33:42
【问题描述】:

我有一个很好的 mongoose 聚合函数,它使用以下结构运行分页 (mongoose-aggregate-paginate-v2):

export const export = (req, res) => {
  
  const optionsPaginate = {
    offset: parseInt(req.query.skip),
    limit: parseInt(req.query.top),
  };

  const aggregate = model.aggregate([
    {$match: {some arguments in here}},
    {$fetch:{
      item1: {some stuff},
      item2: {some stuff},
      item3: {some stuff}
  ]);

  model.aggregatePaginate(aggregate, optionsPaginate, (err, results) => {
   res.json(results);
  })
};

作为回报,我得到一个物品清单:

{
items: [
   {
   item1: [...],
   item2: [...],
   item3: [...],
   }
   ]
}

因为这是一个只有一个元素的数组(包含一堆数组),所以没有选项可以跳过:我只能取唯一/第一个元素或什么都不带。如何将聚合的输出从数组更改为对象,以便分页函数可以迭代一堆 fetch-objects?此更改需要在应用分页之前发生,否则 mongoose-aggregate-paginate 不起作用。 所以分页会起作用,如果会有类似的输出

{
  items: [
     {
       item1: [...]
     },
     {
       item2: [...]
     },
     {
       item3: [...]
     }
   }
 ]
}

我尝试在管道末尾应用一些 $replaceRoot$arrayToObject,但出现 mongoDB 错误。

【问题讨论】:

    标签: node.js mongodb mongoose fetch aggregate


    【解决方案1】:

    您可以简单地使用$arrayElemAt 来获取nth 项数。

    db.collection.aggregate([
      {
        $project: {
          items: {
            $ifNull: [
              {
                "$arrayElemAt": [
                  "$items",
                  0
                ]
              },
              []
            ]
          }
        }
      }
    ])
    

    工作Mongo playground

    如果需要去掉包装,可以使用$replaceRoot

    【讨论】:

    • 但我不想访问这些数组,我想将它们转换为适当的对象,以便分页可以工作。我对单个元素不感兴趣。我想将 ``` { item: [ { 'item1': [...], 'item2': [...], 'item3': [...] ]} } ``` 转换成 `` ` { item: [ { 'item1': [...] }, 'item2': [...] }, 'item3': [...] } ]} } ``` 因为分页会起作用。
    • 好的,你的预期输出是什么
    • 简而言之:不是一个对象,而是一堆对象。因为分页只会遍历某些东西,如果有多个对象。
    • 您在示例中给出的输出与您在输入中给出的相同。我看不出两者有什么区别?
    • 对不起,我错过了一些括号,由于某种原因,我不能再编辑了。然而,为了更容易理解,我还创建了一个游乐场。正如你所看到的,我尝试用根来改变一些东西,但不是每个方面的对象,我仍然得到一个列表,只有对象作为输出mongoplayground.net/p/uh5NKKBDmsh
    猜你喜欢
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2012-01-23
    • 2012-09-06
    相关资源
    最近更新 更多