【问题标题】:How to get count by order in mongodb aggregate?如何在mongodb聚合中按顺序获取计数?
【发布时间】:2020-12-04 01:26:02
【问题描述】:

我有两个集合名称listingsmoods

listings 样本:

{
    "_id": ObjectId("5349b4ddd2781d08c09890f3"),
    "name": "Hotel Radisson Blu",
    "moods": [
      ObjectId("507f1f77bcf86cd799439010"),
      ObjectId("507f1f77bcf86cd799439011")
    ]
}

moods 示例:

{
    "_id": ObjectId("507f1f77bcf86cd799439011"),
    "name": "Sports"
},
{
    "_id": ObjectId("507f1f77bcf86cd799439010"),
    "name": "Spanish Food"
},
{
    "_id": ObjectId("507f1f77bcf86cd799439009"),
    "name": "Action"
}

我需要这张唱片。

{
    "_id": ObjectId("507f1f77bcf86cd799439011"),
    "name": "Sports",
    "count": 1
},
{
    "_id": ObjectId("507f1f77bcf86cd799439010"),
    "name": "Spanish Food",
    "count": 1
},
{
    "_id": ObjectId("507f1f77bcf86cd799439009"),
    "name": "Action",
    "count": 0
}

我需要这种类型的记录。我对聚合一无所知。

【问题讨论】:

    标签: mongodb mongoose aggregation-framework mongoose-schema mongoose-populate


    【解决方案1】:

    您可以使用aggregate()

    • $lookup加入收藏listings
    • $match 管道检查moods _id 在listings 字段moods 数组中
    db.moods.aggregate([
      {
        "$lookup": {
          "from": "listings",
          "as": "count",
          let: { id: "$_id" },
          pipeline: [
            {
              "$match": {
                "$expr": { "$in": ["$$id", "$moods"] }
              }
            }
          ]
        }
      },
    
    • $addFields 添加count 在我们从上面查找得到的数组count$size 的基础上
      {
        $addFields: {
          count: { $size: "$count" }
        }
      }
    ])
    

    Playground

    【讨论】:

      【解决方案2】:

      这项工作:

      db.collection.aggrate().count() 
      

      尝试组合功能,可能会奏效。

      【讨论】:

      • 有什么想法吗?如何使用我的收藏?
      • moods 是您收藏的名称,因此您可以尝试 db.moods.aggragate().count() 根据要求提供参数。
      猜你喜欢
      • 2017-01-24
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 2017-02-12
      • 2020-03-09
      • 2019-12-29
      相关资源
      最近更新 更多