【问题标题】:Looping through array to count in mongodb/mongoose循环遍历数组以计算 mongodb/mongoose
【发布时间】:2021-10-26 03:11:28
【问题描述】:

我有一个用户架构,其中包含一个名为 amputationInfo 的值:

amputationInfo: [
      {
        type: String,
      },
    ],

以下是数据库中的示例:

amputationInfo: [
 "Double Symes/Boyd", 
  "Single Above-Elbow"
]

我有一个允许用户发表评论的评论模式,它包含对留下评论的用户的引用:

user: {
  type: mongoose.Schema.ObjectId,
  ref: 'User',
  require: [true, 'Each review must have an associated user!'],
},

当用户留下评论时,我想创建一个聚合函数来查找评论中的用户,找到他们的 amputationInfo,遍历数组并将包含 "Double Symes/Boyd", "Single Above-Elbow" 的用户总数相加

所以如果我们有 3 个用户,他们的 amputationInfo 如下:

 amputationInfo: [
  "Double Symes/Boyd", 
  "Single Above-Elbow"
 ]

amputationInfo: [ 
  "Single Above-Elbow"
]

amputationInfo: []

聚合函数的返回值将计算每个项并将相应的值加一,如下所示:

[
 {
    doubleSymesBoyd: 1,
    singleAboveElbow: 2
  }
]

这是我尝试过的,但我对 mongoDB 的了解还不够,无法解决问题:

[
  {
    '$match': {
      'prosthetistID': new ObjectId('6126ca6148f34c00189f86f5')
    }
  }, {
    '$lookup': {
      'from': 'users', 
      'localField': 'user', 
      'foreignField': '_id', 
      'as': 'userInfo'
    }
  }, {
    '$unwind': {
      'path': '$userInfo'
    }
  }
]

在 $unwind 之后,生成的对象有一个 userInfo 键,其中包含嵌套的 amputationInfo 数组:

【问题讨论】:

    标签: arrays mongodb loops mongoose


    【解决方案1】:

    你可以有以下阶段

    • $unwind 解构数组
    • $group得到每个类别的总和
    • 第二个$group 推入一个文档并使其成为键值对
    • $arrayToObject 得到想要的输出
    • $replaceRoot 将数据输出到root

    这里是代码

    db.collection.aggregate([
      { "$unwind": "$userInfo.amputationInfo" },
      {
        "$group": {
          "_id": "$userInfo.amputationInfo",
          "count": { "$sum": 1 }
        }
      },
      {
        $group: {
          _id: null,
          data: { $push: {
              k: "$_id",
              v: "$count"
            }
          }
        }
      },
      { $project: { data: { "$arrayToObject": "$data" } } },
      { "$replaceRoot": { "newRoot": "$data" } }
    ])
    

    工作Mongo playground

    【讨论】:

    • 好的,这正是我想要的。更进一步......如果我希望输出是一个像 [{Single Above-Elbow: 2, Double Symes/Boyd: 2}] 这样的数组来按最大值排序?
    • @klaurtar1 但这些是键值对,其中键是唯一的。所以我不认为(我不确定)有一种方法可以在对象内部排序,但是你可以像mongoplayground.net/p/gIrVtfQmHAC那样在数组内部排序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    相关资源
    最近更新 更多