nodejs + mongodb错误异常:FieldPath' progress'不以$开头

时间:2015-11-24 14:57:24

标签: node.js mongodb

我试图修改此查询中的第二个管道(我从这里查到nodejs + mongoose - query aggregate

db.todos.aggregate([
{ 
  "$group": { 
      "_id": "$pic",             
      "open_count": {
          "$sum": {
              "$cond": [ { "$eq": [ "$status", "open" ] }, 1, 0 ]
          }
      },
      "progress_count": {
          "$sum": {
              "$cond": [ { "$eq": [ "$status", "progress" ] }, 1, 0 ]
          }
      },
      "done_count": {
          "$sum": {
              "$cond": [ { "$eq": [ "$status", "done" ] }, 1, 0 ]
          }
      },
      "archive_count": {
          "$sum": {
              "$cond": [ { "$eq": [ "$status", "archive" ] }, 1, 0 ]
          }
      } 
  }  
},
{
  "$group": {
      "_id": "$_id",            
      "detail": {
          "$push": {
              "name": "open",
              "$todos": "$open_count"
          },
          "$push": {
              "name": "progress",
              "$todos": "$progress_count"
          },
          "$push": {
              "name": "done",
              "$todos": "$done_count"
          },
          "$push": {
              "name": "archive",
              "$todos": "$archive_count"
          }
      }
  }
},
{
  "$project": {
      "_id": 0, "pic": "$_id", "detail": 1
  }
}
])

我想要这种JSON结构,所以我可以将它放在谷歌图表上,其格式如下:

[
    {
        "pic": "A",
        "detail": [
            {
                "name": "open",
                "todos": 2
            },
            {
                "name": "progress",
                "todos": 1
            },
            {
                "name": "done",
                "todos": 8
            },
            {
                "name": "archive",
                "todos": 20
            }
        ],
        "pic": "B",
        "detail": [
            {
                "name": "open",
                "todos": 5
            },
            {
                "name": "progress",
                "todos": 2
            },
            {
                "name": "done",
                "todos": 5
            },
            {
                "name": "archive",
                "todos": 10
            }
        ],
    }
]

但是我收到了这个错误

exception: FieldPath 'progress' doesn't start with $

1 个答案:

答案 0 :(得分:1)

尝试使用此聚合查询:

db.todos.aggregate([
  {
  "$group": {
    "_id": {
      "pic": "$pic",
      "name": "$status"
    },
    "todos": {
      "$sum": 1
    }
  }
},
{
  "$project": {
    "_id": 0,
    "pic": "$_id.pic",
    "detail": {
      "name": "$_id.name",
      "todos": "$todos"
    }
  }
},
{
  "$group": {
    "_id": "$pic",
    "detail": {
      "$push": "$detail"
    }
  }
},
{
  "$project": {
    "_id": 0, "pic": "$_id", "detail": 1
}
}])