簡體   English   中英

MongoDB跨不同文檔的兩個數組中的項目匯總計數是否相同?

[英]MongoDB aggregate count of items in two arrays across different documents is the same?

這是我的MongoDB集合架構:

company: String
model: String
cons: [String] // array of tags that were marked as "cons"
pros: [String] // array of tags that were marked as "pros"

這是我的query

[
    { "$project": {
        "company": 1,
        "model": 1,
        "data": {
            "$setUnion": [
                { "$map": {
                    "input": "$pros",
                    "as": "pro",
                    "in": {
                        "type": "$pro",
                        "value": "$$pro"
                    }
                }},
                { "$map": {
                    "input": "$cons",
                    "as": "con",
                    "in": {
                        "type": "$con",
                        "value": "$$con"
                    }
                }}
            ]
        }
    }},
    { "$unwind": "$data" },
    { "$group": {
      "_id": { 
          "company": "$company",
          "model": "$model",
          "theTag": "$data.value"
      },
      "sumPros": { 
        "$sum": { 
          "$cond": [
            { "$eq": [ "$data.type", "$pro" ] },
              1,
              0
          ]
        }
      },
      "sumCons": { 
        "$sum": { 
          "$cond": [
            { "$eq": [ "$data.type", "$con" ] },
              1,
              0
          ]
        }
      }
    }},
    { "$group": {
        "_id": { 
            "company": "$_id.company",
            "model": "$_id.model",
        },
        "tags": {$push: { 
          "tag": "$_id.theTag", 
          "pros": "$sumPros",
          "cons": "$sumCons"
        }

      }}
}]

這是輸出:

{
        "_id": {
            "company": "Lenovo",
            "model": "T400"
        },
        "tags": [
            {
                "tag": "Quality",
                "pros": 64, // expected value is 54
                "cons": 64  // expected value is 10
            },
            {
                "tag": "Value",
                "pros": 76, // expected value is 30
                "cons": 76  // expected value is 46
            }
        ]
}
...

請注意, proscons值是相同的。 他們出於某種原因,代表的總和proscons ,我不明白,為什么。

我究竟做錯了什么?

更新:

這是集合中的文檔:

{
  "company": "Lenovo",
  "model": "X200",

  "cons": [
      "Quality"
  ],
  "pros": [
      "Value",
      "Styling"
  ]
}

作為您在查詢中使用的內容的作者,以及在要求您以實際上支持該問題中的聲明的數據形式提交某些信息之后,我不得不說您的說法是錯誤的。

作為記錄,這是您在回答時的樣本:

{
  "company": "Lenovo",
  "model": "X200",

  "cons": [
      "Quality"
  ],
  "pros": [
      "Value",
      "Styling"
  ]
}

在這里的樣本中,如果我運行以下查詢(並且確實對以前的答案中的任何誤導性操作擴大了責任范圍,並將立即予以糾正),那么我看到的結果應該是預期的:

db.collection.aggregate([
    { "$project": {
        "company": 1,
        "model": 1,
        "data": {
            "$setUnion": [
                { "$map": {
                    "input": "$cons",
                    "as": "con",
                    "in": {
                        "type": { "$literal": "con" },
                        "value": "$$con"
                    }
                }},
                { "$map": {
                    "input": "$pros",
                    "as": "pro",
                    "in": {
                        "type": { "$literal": "pro" },
                        "value": "$$pro"
                    }
                }}
            ]
        }
    }},
    { "$unwind": "$data" },
    { "$group": {
        "_id": {
            "company": "$company",
            "model": "$model",
            "tag": "$data.value"
        },
        "pros": {
            "$sum": {
                "$cond": [
                    { "$eq": [ "$data.type", "pro" ] },
                    1,
                    0
                ]
            }
        },
        "cons": {
            "$sum": {
                "$cond": [
                    { "$eq": [ "$data.type", "con" ] },
                    1,
                    0
                ]
            }
        }
    }}
])

由您的樣品產生

{
    "_id" : {
            "company" : "Lenovo",
            "model" : "X200",
            "tag" : "Quality"
    },
    "pros" : 0,
    "cons" : 1
}
{
    "_id" : {
            "company" : "Lenovo",
            "model" : "X200",
            "tag" : "Value"
    },
    "pros" : 1,
    "cons" : 0
}
{
    "_id" : {
            "company" : "Lenovo",
            "model" : "X200",
            "tag" : "Styling"
    },
    "pros" : 1,
    "cons" : 0
}

顯然,可以正確地在分組鍵之間正確分配“優點”和“缺點”總數。

因此,這里的“我看到的”是,這些值實際上不是“相同”,而是實際上是“不同的”,因為它們與賦予每個字段累加器的不同條件相匹配。


因此,請根據您的原始問題進一步說明

db.collection.aggregate([
    { "$project": {
        "company": 1,
        "model": 1,
        "data": {
            "$setUnion": [
                { "$map": {
                    "input": "$cons",
                    "as": "con",
                    "in": {
                        "type": { "$literal": "con" },
                        "value": "$$con"
                    }
                }},
                { "$map": {
                    "input": "$pros",
                    "as": "pro",
                    "in": {
                        "type": { "$literal": "pro" },
                        "value": "$$pro"
                    }
                }}
            ]
        }
    }},
    { "$unwind": "$data" },
    { "$group": {
        "_id": {
            "company": "$company",
            "model": "$model",
            "tag": "$data.value"
        },
        "pros": {
            "$sum": {
                "$cond": [
                    { "$eq": [ "$data.type", "pro" ] },
                    1,
                    0
                ]
            }
        },
        "cons": {
            "$sum": {
                "$cond": [
                    { "$eq": [ "$data.type", "con" ] },
                    1,
                    0
                ]
            }
        }
    }},
    { "$group": {
        "_id": {
            "company": "$_id.company",
            "model": "$_id.model"
        },
        "data": { "$push": {
            "tag": "$_id.tag",
            "pros": "$pros",
            "cons": "$cons"
        }}
    }}
])

產生:

{
    "_id" : {
            "company" : "Lenovo",
            "model" : "X200"
    },
    "data" : [
            {
                    "tag" : "Quality",
                    "pros" : 0,
                    "cons" : 1
            },
            {
                    "tag" : "Value",
                    "pros" : 1,
                    "cons" : 0
            },
            {
                    "tag" : "Styling",
                    "pros" : 1,
                    "cons" : 0
            }
    ]
}

這正是您要的。

暫無
暫無

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

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