【问题标题】:Mongo DB query to return count?Mongodb查询返回计数?
【发布时间】:2021-12-06 07:42:26
【问题描述】:

我有两个集合 CourseFile。 这是我来自Course 集合的数据

[{
    _id: 1,
    name: "Course1",
    price: "100"
},
{
    _id: 2,
    name: "Course2",
    price: "200"
}]

这是我收集的文件中的数据

[{
    _id: 1,
    name: "File1",
    isFree: true,
    courseId: 1
}
{
    _id: 2,
    name: "File2",
    isFree: false,
    courseId: 1
}
{
    _id: 3,
    name: "File3",
    isFree: false,
    courseId: 1
}]

我想用Course name,Count of files which are free,Count of files which are not free 检索课程 1。

我的尝试:

Course.aggregate([
    {$lookup:{
        from:"files",
        localField: "_id",
        foreignField: "courseId",
        as: "files"
    }},
])

如果我执行上述查询,这是我的回复:

[
    {
        "_id": "6161bdcc0aada09d81598840",
        "name": "Course1",
        "files": [
            {
                "_id": "6166a0814ad3f56b71232b9c",
                "name": "File1.jpeg",
                "isFree":true
            },
            {
                "_id": "6166a0814ad3f56b71232b9d",
                "name": "File2.jpeg",
                "isFree":false
            },
            {
                "_id": "6166a0814ad3f56b71232b9v",
                "name": "File3.jpeg",
                "isFree":false
            }
        ]
    }
]

我希望我的输出为:

[
    {
        "_id": "6161bdcc0aada09d81598840",
        "name": "Course1",
        "files": {"free": 1,"paid": 2}
    }
]

【问题讨论】:

    标签: javascript database mongodb mongoose


    【解决方案1】:

    您可以尝试使用管道查找,

    • $lookup 与管道,通过 courseIdlet
    • $matchcourseId条件
    • $group by isFeee 并获得总数
    • $project 以 k(key) 和 v(value) 格式显示必填字段
    • $cond 检查 isFree 是否为真,然后返回“免费”,否则返回“付费”
    • $addFields 更新files 数组
    • $arrayToObjectfiles 键值数组转换为对象
    • $ifNull 检查属性是否不存在然后设置 0
    await Course.aggregate([
      {
        $lookup: {
          from: "files",
          let: { courseId: "$_id" },
          pipeline: [
            { $match: { $expr: { $eq: ["$$courseId", "$courseId"] } } },
            {
              $group: {
                _id: "$isFree",
                count: { $sum: 1 }
              }
            },
            {
              $project: {
                _id: 0,
                k: { $cond: ["$_id", "free", "paid"] },
                v: "$count"
              }
            }
          ],
          as: "files"
        }
      },
      {
        $addFields: {
          files: { $arrayToObject: "$files" }
        }
      },
      {
        $addFields: {
          "files.free": { $ifNull: ["$files.free", 0] },
          "files.paid": { $ifNull: ["$files.paid", 0] }
        }
      }
    ])
    

    Playground

    【讨论】:

      【解决方案2】:

      尝试以下操作:

      db.course.aggregate([
        {
          $lookup: {
            from: "files",
            localField: "_id",
            foreignField: "courseId",
            as: "files",
          },
        },
        {
          $unwind: {
            path: "$files",
            preserveNullAndEmptyArrays: true,
          },
        },
        {
          $group: {
            _id: "$_id",
            name: {
              $first: "$name",
            },
            price: {
              $first: "$price",
            },
            free: {
              $sum: {
                $cond: [
                  {
                    $eq: ["$files.isFree", true],
                  },
                  1,
                  0,
                ],
              },
            },
            paid: {
              $sum: {
                $cond: [
                  {
                    $eq: ["$files.isFree", false],
                  },
                  1,
                  0,
                ],
              },
            },
          },
        },
        {
          $addFields: {
            "files.free": "$free",
            "files.paid": "$paid",
          },
        },
        {
          $project: {
            _id: 1,
            name: 1,
            files: 1,
            price: 1,
          },
        },
      ]);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-24
        • 2015-05-14
        • 2014-04-22
        • 1970-01-01
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 2018-11-19
        相关资源
        最近更新 更多