mongoDB запрос нескольких подсчетов - PullRequest
0 голосов
/ 29 июня 2018

У меня есть следующая структура моих документов в моем MongoDB:

{ "_id": ObjectId("59b799e462f0b9402dbcd69e"), "project": "ABC", "locked": true }

{ "_id": ObjectId("59b799e462f0b9402dbcd69f"), "project": "DEF", "locked": false }

{ "_id": ObjectId("59b799e462f0b9402dbcd70a"), "project": "XYZ", "locked": true }

{ "_id": ObjectId("59b799e462f0b9402dbcd70b"), "project": "ABC", "locked": true }

{ "_id": ObjectId("59b799e462f0b9402dbcd70c"), "project": "XYZ", "locked": false }

Я хочу узнать количество заблокированных и разблокированных проектов, сгруппированных по полю проекта, которое должно дать мне что-то вроде этого:

[
  {
     project: "ABC",
     lockedCount: 2,
     unlockedCount: 0,
     totalCount: 2
  },
  {
     project: "DEF",
     lockedCount: 0,
     unlockedCount: 1,
     totalCount: 1
  },
  {
     project: "XYZ",
     lockedCount: 1,
     unlockedCount: 1,
     totalCount: 2
  }
]

Возможно ли использовать только 1 запрос?

1 Ответ

0 голосов
/ 29 июня 2018

Вы можете сделать это с помощью операции Aggregate .

db.yourCollectionName.aggregate(
[{
    $group : {
        _id : "$project",
        "lockedCount" : {$sum : {
             $cond: { if: "$locked", then: 1, else: 0 }
           }},
           "unlockedCount" : {$sum : {
             $cond: { if: "$locked", then: 0, else: 1 }
           }},
         "totalCount" : {$sum : 1}
        }
    }]
)

Выход:

/* 1 */
{
    "_id" : "XYZ",
    "lockedCount" : 1.0,
    "unlockedCount" : 1.0,
    "totalCount" : 2.0
}

/* 2 */
{
    "_id" : "DEF",
    "lockedCount" : 0.0,
    "unlockedCount" : 1.0,
    "totalCount" : 1.0
}

/* 3 */
{
    "_id" : "ABC",
    "lockedCount" : 2.0,
    "unlockedCount" : 0.0,
    "totalCount" : 2.0
}

Обновлено

Если вы хотите переименовать _id с помощью project, то вы можете сделать это, используя $project в конце операции $group, например

db.yourCollectionName.aggregate(
    [{
        $group : {
            _id : "$project",
            "lockedCount" : {$sum : {
                 $cond: { if: "$locked", then: 1, else: 0 }
               }},
               "unlockedCount" : {$sum : {
                 $cond: { if: "$locked", then: 0, else: 1 }
               }},
             "totalCount" : {$sum : 1}
            }
        },
        {
        $project : {
            _id : 0,
            project : "$_id",
            lockedCount : "$lockedCount",
            unLockedCount : "$unlockedCount",
            totalCount : "$totalCount"
            }
        }]
    )

Выход:

/* 1 */
{
    "project" : "XYZ",
    "lockedCount" : 1.0,
    "unLockedCount" : 1.0,
    "totalCount" : 2.0
}

/* 2 */
{
    "project" : "DEF",
    "lockedCount" : 0.0,
    "unLockedCount" : 1.0,
    "totalCount" : 1.0
}

/* 3 */
{
    "project" : "ABC",
    "lockedCount" : 2.0,
    "unLockedCount" : 0.0,
    "totalCount" : 2.0
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...