【问题标题】:Mongodb aggregate match and group documents, with additional checkMongodb 聚合匹配和分组文档,附加检查
【发布时间】:2020-01-09 08:03:21
【问题描述】:

所以我有 2 个模型:问题和答案。

答案有:questionId、userId、answer(字符串)。

我需要一个聚合管道:

  1. 按 questionId 匹配所有答案
  2. 查看当前用户是否已经投票(是他在匹配文档中的 id)
  3. 将答案分组并计数

我这样实现了 1 和 3:

const q = ObjectId('5d6e52a68558b63fb9302efd');
const user = ObjectId('5d0b3f7daceeb50c477b49e0');

Answer.aggregate([
    { $match: { questionId: q } },
    { $group: { _id: '$answer', count: { $sum: 1 } } },
])

我在这两个聚合管道之间缺少一个步骤,我将在其中迭代匹配的文档,并检查 userId 是否与用户匹配。

我想得到一些像这样的对象:

{
     didIVote: true,
     result: [ { _id: 'YES', count: 5 }, { _id: 'NO', count: 2 } ]
}

甚至可能是这样的:

[
    { _id: 'YES', count: 5, didIVote: true },
    { _id: 'NO', count: 2, didIVote: false },
]

【问题讨论】:

    标签: mongodb mongoose aggregate


    【解决方案1】:
    • $group 阶段,创建一个包含投票用户的数组 每个答案。
    • 添加一个额外的$project 阶段以检查用户是否在数组中。
        const q = ObjectId('5d6e52a68558b63fb9302efd');
        const user = ObjectId('5d0b3f7daceeb50c477b49e0');
    
        Answer.aggregate([
          { $match: { questionId: q } },
          {
            $group: {
              _id: '$answer',
              count: { $sum: 1 },
              voted: { $addToSet: "$userId" }
            }
          },
          {
            $project: {
              count: 1,
              didIVote: { $in: [ user, "$voted" ] },
            }
          }
        ]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-04
      • 2020-06-29
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      • 2018-06-13
      相关资源
      最近更新 更多