当前位置: 首页 > 知识库问答 >
问题:

MongoDb聚合:在给定array-1和array-2的情况下,如何基于另一个array-2对array-1进行分组?

颜黎昕
2023-03-14

编辑:我最初的问题是

MongoDb聚合:能否在$lookup阶段的管道中$unwind输入文档变量

考虑下面的代码:

{$lookup: {
    from:"mydoc", 
    let: {"c":"$myArray"}, 
    pipeline: [ 
        {$unwind: "$$c"},
    ]
    as:"myNewDoc"
 }}

如果我想的话,我该如何放松c

////原问题结束

从Tom Slabbaert的评论中,我们现在知道可以在$lookup阶段的管道中$展开输入文档变量。但不推荐。

我想要实现什么?

从我提出的问题的答案中,考虑这些集合,即代码>投票调查问卷/代码>和<代码> CASTEDPosiv>代码>。

我正在尝试获得如下输出:

numberOfVotes: 6,
hasThisUserVoted: true,
numberOfComments: 12,
castedVotesPerChoice:{
    "choiceA": [
        {"_id": ObjectId("..."), "voter": "Juzi", "choice": 0, "pollId": 100 },
        {"_id": ObjectId("..."), "voter": "Juma", "choice": 0, "pollId": 100 },
        {"_id": ObjectId("..."), "voter": "Jane", "choice": 0, "pollId": 100 },
    ],
    "choiceB": [
        {"_id": ObjectId("..."), "voter": "Jamo", "choice": 1, "pollId": 100 },
        {"_id": ObjectId("..."), "voter": "Juju", "choice": 1, "pollId": 100 },
        {"_id": ObjectId("..."), "voter": "Jana", "choice": 1, "pollId": 100 }
    ],
    "choiceC": [ ]
}

我目前的执行情况:

db.poll.aggregate([
    {"$match": {"_id": 100}}, 
    // ...lookup to get comments
    {"$lookup": {
        "from":"castedvotes", 
        "let": {"pollId":"$_id"}, 
        "pipeline":[
            {"$match":
                {"$expr":
                    {"$eq": ["$pollId", "$$pollId"]},
            }},
        ], 
        "as":"votes" // will use this to get number of votes and find out if the authenticated user has voted.
    }},
    {"$unwind":"$choices"},
    {"$lookup": {
        "from":"castedvotes", 
        "let": {"c":"$choices"}, 
        "pipeline":[
            {"$match":
                {"$expr":
                    {"$eq": ["$choice", "$$c.id"]},
            }},
        ], 
        "as":"votesPerChoice"
    }},
])

我目前的实现存在的问题是,它在同一个集合上进行了两次查找,我觉得这是不必要的,而且它使代码不枯燥。使用$unwind我知道我可以按此处所述取消$unwind

因此,我的问题是,如何通过对强制投票集合进行一次$lookup来获得所需的输出?因为两个查找都返回相同的数据。

或者以不同的方式问这个问题,当给定array-1和array-2时,我如何在mongob聚合中基于另一个array-2对array-1进行分组?

这个问题回答了如何通过以某种方式构造$lookup阶段,基于mongodb聚合中的另一个数组对数组进行分组。它没有回答我的问题。

共有1个答案

常炯
2023-03-14

如果我正确理解了“拼图”文章(文章标题和编辑是不同的用例),我们可以通过单个$lookup,获得所需的结果:

db.poll.aggregate([
  {
    "$match": {
      "_id": 100
    }
  },
  {
    "$lookup": {
      "from": "castedvotes",
      "localField": "pollId",
      "foreignField": "choices.id",
      "as": "voters"
    }
  },
  {
    $project: {
      numberOfVotes: {
        $size: "$voters"
      },
      hasThisUserVoted: {
        $in: [
          "$_id",
          "$voters.pollId"
        ]
      },
      /**How to calculate it?*/
      numberOfComments: {
        $multiply: [
          {
            $size: "$voters"
          },
          2
        ]
      },
      castedVotesPerChoice: {
        $arrayToObject: {
          $map: {
            input: "$choices",
            as: "choice",
            in: {
              k: "$$choice.name",
              v: {
                $filter: {
                  input: "$voters",
                  as: "voter",
                  cond: {
                    $eq: [
                      "$$voter.choice",
                      "$$choice.id"
                    ]
                  }
                }
              }
            }
          }
        }
      }
    }
  }
])

MongoPlayground

 类似资料:
  • 二维数组是数组中的数组。 它是一个数组数组。 在这种类型的数组中,数据元素的位置由两个索引而不是一个索引引用。 因此它表示一个包含行和数据dcolumns的表。 在下面的二维数组示例中,观察者认为每个数组元素本身也是一个数组。 考虑每天记录4次温度的例子。 有时记录仪器可能有故障,我们无法记录数据。 4天的这种数据可以表示为如下的二维阵列。 Day 1 - 11 12 5 2 Day 2 - 1

  • 问题内容: 我有一个数组,例如我的数据列表为JSON。// 我想结合像2的数组,我试图追加它们。-合并-追加 控制者 Beego(golang)API返回JSON 问题答案: 希望是你想要的

  • 问题内容: 之间有什么区别(如果有) 和 我应该使用哪一个? 问题答案: 该规范说: 当作为函数而不是构造函数调用时,它将创建并初始化一个新的Array对象。因此,函数调用等效于具有相同参数的对象创建表达式。

  • Given two sorted integer arrays A and B, merge B into A as one sorted array. Note: You may assume that A has enough space (size that is greater or equal to m + n) to hold additional elements from B. T

  • 两者之间有实际区别吗 和 ? 看起来包含常量元素的非常量数组仍然无法交换,赋值运算符也不起作用<我什么时候应该选择一个而不是另一个?

  • Rotate Array 描述 Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4]. Note: Try to come up as many solution