将值转换为 mongodb 中的键

Chi*_*tle 3 mongodb aggregation-framework

我有具有这种形状的衬衫尺寸的 MongoDB 文档:

{ "_id" : "L", "count" : 2.0 },
{ "_id" : "XL", "count" : 2.0 },
{ "_id" : "XXXL", "count" : 1.0 },
{ "_id" : "M", "count" : 1.0 }
Run Code Online (Sandbox Code Playgroud)

如何返回符合以下条件的单个文档:

  • 返回值,而不是键
  • 按衬衫尺寸标签订购
  • 将浮点值转换为整数
  • 当衬衫尺寸标签不存在时返回值为 0 的标签

想要的形状:

{
  S: 0,
  M: 1,
  L: 2,
  XL: 2,
  XXL: 0,
  XXXL: 1
}
Run Code Online (Sandbox Code Playgroud)

Ash*_*shh 5

您需要首先使用$groupstage withkvpair推送数组中的所有值...然后使用arrayToObject聚合提取键值对,最后您必须检查$ifNull每个大小的条件

db.collection.aggregate([
  { "$group": {
    "_id": null,
    "array": {
      "$push": {
        "k": "$_id",
        "v": "$count"
      }
    }
  }},
  { "$replaceRoot": {
    "newRoot": { "$arrayToObject": "$array" }
  }},
  { "$addFields": {
    "S": { "$ifNull": ["$S", 0] },
    "M": { "$ifNull": ["$M", 0] },
    "L": { "$ifNull": ["$L", 0] },
    "XL": { "$ifNull": ["$XL",0]},
    "XXL": { "$ifNull": ["$XXL", 0]},
    "XXXL": { "$ifNull": ["$XXXL", 0] }
  }}
])
Run Code Online (Sandbox Code Playgroud)

输出

[
  {
    "L": 2,
    "M": 1,
    "S": 0,
    "XL": 2,
    "XXL": 0,
    "XXXL": 1
  }
]
Run Code Online (Sandbox Code Playgroud)

在这里检查