计算mongodb聚合中其他文档中的项目

计算mongodb聚合中其他文档中的项目,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我有两份不同的文件 Accounts [ {_id:1, name:'xyz'}, {_id:2, name:'abc'}, {_id:3, name:'def'}, {_id:4, name:'pqr'}, ] 及 如何计算单个帐户的true和false响应数,同时保持其原始字段 例如 我尝试使用$lookup将其他文档加入到一个字段中,但无法计算不同的响应 db.accounts.aggregate([ { $match: { _id: 2 }

我有两份不同的文件

Accounts
[
  {_id:1, name:'xyz'},
  {_id:2, name:'abc'},
  {_id:3, name:'def'},
  {_id:4, name:'pqr'},
]

如何计算单个帐户的truefalse响应数,同时保持其原始字段

例如

我尝试使用$lookup将其他文档加入到一个字段中,但无法计算不同的响应

db.accounts.aggregate([
    {
        $match: { _id: 2 }
    },
    {
        $lookup:{
            from: 'responses',
            localField: '_id',
            foreignField: 'accountId',
            as: 'responses'
        }
    }
])
有很多方法

  • $match
    消除不需要的数据
  • $lookup
    加入集合
  • $unwind
    解构阵列
  • $group
    重建数组,而
    $sum
    使用
    $cond
    条件有助于增加1
这是剧本

db.Accounts.aggregate([
  { $match: { _id: 2 } },
  {
    $lookup: {
      from: "Responses",
      localField: "_id",
      foreignField: "accountId",
      as: "responses"
    }
  },
  {
    $unwind: "$responses"
  },
  {
    $group: {
      _id: "$_id",
      name: { $first: "$name" },
      trueResponses: {
        $sum: {
          $cond: [{ $eq: [ "$responses.res", true]},1,0]
        }
      },
      falseResponses: {
        $sum: {
          $cond: [{ $eq: [ "$responses.res", false]},1,0]
        }
      }
    }
  }
])
工作

db.accounts.aggregate([
    {
        $match: { _id: 2 }
    },
    {
        $lookup:{
            from: 'responses',
            localField: '_id',
            foreignField: 'accountId',
            as: 'responses'
        }
    }
])
db.Accounts.aggregate([
  { $match: { _id: 2 } },
  {
    $lookup: {
      from: "Responses",
      localField: "_id",
      foreignField: "accountId",
      as: "responses"
    }
  },
  {
    $unwind: "$responses"
  },
  {
    $group: {
      _id: "$_id",
      name: { $first: "$name" },
      trueResponses: {
        $sum: {
          $cond: [{ $eq: [ "$responses.res", true]},1,0]
        }
      },
      falseResponses: {
        $sum: {
          $cond: [{ $eq: [ "$responses.res", false]},1,0]
        }
      }
    }
  }
])