【问题标题】:Aggregation with Mongodb using mongoose使用 mongoose 与 Mongodb 进行聚合
【发布时间】:2015-08-01 04:52:12
【问题描述】:

嘿,我正在尝试使用 moongose 在 mongodb 上进行一些聚合: 我得到了这些数据:

[
  {
    "school": "1",
    "preferences": [
      {
        "person": "X",
        "color": "A"
      },
      {
        "person": "X",
        "color": "B"
      },
      {
        "person": "Y",
        "color": "A"
      }
    ]
  },
  {
    "school": "2",
    "preferences": [
      {
        "person": "Z",
        "color": "A"
      },
      {
        "person": "Y",
        "color": "C"
      }
    ]
  }
]

我认为数据可以自我解释,我想要得到的结果是, 当我查询匹配“1”的学校时。我想得到这个结果:

[
  {
    "_id": "X",
    "colors": [
      "A",
      "B"
    ]
  },
  {
    "_id": "Y",
    "colors": ["A"]
  }
]

我之前使用过聚合,但我无法得到这个结果。

【问题讨论】:

    标签: node.js mongodb mongoose aggregation-framework


    【解决方案1】:

    检查这个聚合查询:

    db.collectionName.aggregate({
      "$match": {
        "school": "1"
      }
    }, {
      "$unwind": "$preferences"
    }, {
      "$group": {
        "_id": "$preferences.person",
        "colors": {
          "$addToSet": "$preferences.color" // $addToSet used here only to add distinct color 
        }
      }
    })
    

    编辑如果你想计算color的数量,那么使用sum的组如下:

    db.collectionName.aggregate({
      "$match": {
        "school": "1"
      }
    }, {
      "$unwind": "$preferences"
    }, {
      "$group": {
        "_id": "$preferences.color",
        "appears": {
          "$sum": 1
        }
      }
    })
    

    编辑

    根据您的新要求,您应该进行以下聚合:

        db.collectionName.aggregate({
        "$unwind": "$preferences"
    },
    {
        "$group": {
            "_id": {
                "person": "$preferences.person",
                "color": "$preferences.color"
            },
            "count": {
                "$sum": 1
            }
        }
    },
    {
        "$group": {
            "_id": "$_id.person",
            "colors": {
                "$push": {
                    "color": "$_id.color",
                    "count": "$count"
                }
            }
        }
    },
    {
        "$project": {
            "_id": 0,
            "person": "$_id",
            "colors": 1
        }
    }).pretty()
    

    【讨论】:

    • 嘿,谢谢你,我不敢相信我正在努力尝试这个并且如此简单,我正在使用匹配 id,项目人员:$preferences.person,颜色:$preferences.color,解开这个人,组_id:人,颜色:$addToSet:$color,但没有让它工作总是得到这个人,但每种颜色都会重复到每个人身上。
    • 如果我想再次与学校匹配怎么办? ``` [ { "_id": "A", // 颜色 "出现": 2 // 2 人}, { "_id": "B", "出现": 1 } ] ``` @yogesh
    • 根据您的查询,您首先将它们投影为{"$project":{"person":"$preferences.person","color":"$preferences.color"}},因此person and color 的返回数组就像"person" : [ "X", "X", "Y" ], "color" : [ "A", "B", "A" ] 一样,然后您使用unwind to person {"$unwind":"$person"} 它只会展开@987654331 @数组不是color数组在person分组后看起来像这样"person" : "X", "color" : [ "A", "B", "A" ],然后你使用addToSet as color 所以颜色包含这样的数组数组"_id" : "Y", "color" : [ [ "A", "B", "A" ] ]
    • 你好@yogesh,我想知道你能不能帮我解决这个问题,我的数据集改为:` [ { "school": "1", "preferences": [ { “人”:“X”,“颜色”:“A”},{“人”:“X”,“颜色”:“B”},{“人”:“Y”,“颜色”:“A " }, { "person": "X", "color": "A" }, { "person": "Y", "color": "A" } ] } ] `
    • 现在发生的事情是人物和颜色的组合可以被复制,所以我想得到这样的东西:** [ { "_id": "X", "colors": [ {“颜色”:“A”,“计数”:“2”},{“颜色”:“B”,“计数”:“1”}]},{“_id”:“Y”,“颜色": [ { "color": "A" , "count": "2" } ] } ] **
    猜你喜欢
    • 2020-10-14
    • 2016-07-02
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 2019-06-29
    • 2019-02-03
    相关资源
    最近更新 更多