簡體   English   中英

Mongo DB 查詢返回計數?

[英]Mongo DB query to return count?

我有兩個集合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 nameCount of files which are free Count of files which are not free Count of files which are 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}
    }
]

您可以嘗試使用管道查找,

  • $lookup與管道,在let傳遞courseId
  • $match courseId條件
  • $group by isFeee並獲得總數
  • $project以 k(key) 和 v(value) 格式顯示必填字段
  • $cond檢查isFree是否isFree真,然后返回“free”,否則返回“paid”
  • $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] }
    }
  }
])

操場

嘗試以下操作:

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,
    },
  },
]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM