如何获得数组嵌入式数组猫鼬的大小?

时间:2019-08-29 07:12:00

标签: javascript node.js mongodb mongoose

我有一个类别集合,我想通过ID与一些​​选项来获取类别。这是数据库中集合的结构。

[
  {
    "_id": "5d67296bf35b984e74486924",
    "name": "Dinrk",
    "images": [],
    "recipes": [
      {
        "name": "Coffee",
        "time": 20,
        "img": "https://google.com/image-example.jpg",
        "des": "This is description",
        "serving": 2,
        "components": [
          {
            "name": "Dink 1",
            "quantity": "1"
          },
          {
            "name": "Dink 2",
            "quantity": "1"
          },
          {
            "name": "Dink 2",
            "quantity": "1"
          }
        ],
        "cook_steps": [
          {
            "des": "This is description",
            "pictures": []
          },
          {
            "des": "This is description",
            "pictures": []
          }
        ]
      },
      {
        "name": "Coffee",
        "time": 20,
        "img": "https://google.com/image-example.jpg",
        "des": "This is description",
        "serving": 2,
        "components": [
          {
            "name": "Dink 1",
            "quantity": "1"
          },
          {
            "name": "Dink 2",
            "quantity": "1"
          }
        ],
        "cook_steps": [
          {
            "des": "This is description",
            "pictures": []
          },
          {
            "des": "This is description",
            "pictures": []
          }
        ]
      }
    ]
  },
  {
    "_id": "5d67296bf35b984e74486435555",
    "name": "Cake",
    "images": [],
    "recipes": [
      {
        "name": "Cake",
        "time": 20,
        "img": "https://google.com/image-example.jpg",
        "des": "This is description",
        "serving": 2,
        "components": [
          {
            "name": "Cake 1",
            "quantity": "1"
          },
          {
            "name": "Cake 2",
            "quantity": "1"
          },
          {
            "name": "Cake 2",
            "quantity": "1"
          }
        ],
        "cook_steps": [
          {
            "des": "This is description",
            "pictures": []
          },
          {
            "des": "This is description",
            "pictures": []
          }
        ]
      },
      {
        "name": "Coffee",
        "time": 20,
        "img": "https://google.com/image-example.jpg",
        "des": "This is description",
        "serving": 2,
        "components": [
          {
            "name": "Cake 1",
            "quantity": "1"
          }
        ],
        "cook_steps": [
          {
            "des": "This is description",
            "pictures": []
          },
          {
            "des": "This is description",
            "pictures": []
          }
        ]
      }
    ]
  }
]

这是我的代码,用于尝试categoryId =“ 5d67296bf35b984e74486924”

Category.aggregate([
            {
                $match: {'_id': categoryId}
            },
            {
                $unwind: '$recipes'
            },
            {
                $project: {
                    'total_components': {'$size': '$recipes.components'},
                    'total_cook_steps': {'$size': '$recipes.cook_steps'}
                }
            }
        ]).then(function(data) {

}, function(err) {

})

预期结果是

{
    "_id": "5d67296bf35b984e74486924",
    "name": "Dinrk",
    "images": [],
    "recipes": [
      {
        "name": "Coffee",
        "time": 20,
        "img": "https://google.com/image-example.jpg",
        "des": "This is description",
        "serving": 2,
        "total_components": 3,
        "total_cook_steps": 2
      },
      {
        "name": "Coffee",
        "time": 20,
        "img": "https://google.com/image-example.jpg",
        "des": "This is description",
        "serving": 2,
        "total_components": 2,
        "total_cook_steps": 2
      }
    ]
  }

但是当我运行我的代码时,结果是[]。

如果您了解我的问题,请帮助我。我搜索了很多,但是找不到解决方案。所以我想问大家。非常感谢。

1 个答案:

答案 0 :(得分:1)

由于猫鼬does not auto-cast the 24 char hex string to ObjectId in its aggregate pipeline因为$project$group会以令人惊讶的方式更改架构,因此很难推断出应为{{ 1}}。

您需要手动转换ObjectId 使用categoryId方法将字符串转换为ObjectId

计算$map运算符而不是$unwind中的新字段,因为这使您可以用更少的管道步骤来进行汇总操作

mongoose.Types.ObjectId