Как получить условные поля в Mongodb - PullRequest
0 голосов
/ 23 января 2019

Здравствуйте, хорошие разработчики,

Я новичок в MongoDB и пытаюсь получить условные данные для своих требований.

У меня есть следующая коллекция:

 [
{
    "id":10001,
    "name":"Test 1",
    "status":"live",
    "traffics":[
        {
            "id":"1a3s5d435a4sd",
            "status":"",
        },
        {
            "id":"1a3s5d44as54d35a4sd",
            "status":"CMP",
        },
        {
            "id":"a3s5d454asd34asd",
            "status":"",
        },
        {
            "id":"1a35sd45a4sd34asd3",
            "status":"TERM",
        },
        {
            "id":"as35d435a4sd354as3d43asd4",
            "status":"CMP",
        },
        {
            "id":"135as4d5a4sd354a3s5d43asd",
            "status":"CMP",
        },
        {
            "id":"123as1d31a3d12ads13as",
            "status":"TERM",
        }
    ]

},
{...},{...}
]

Iхочу получить такие данные

ID, Name, count traffics as Starts, count (traffics where status = "CMP") as completes, count (traffics where status = "TERM") as Terminates, count (traffics where status = "") as Abandons

Я пытаюсь выполнить следующую команду

db.inventory.aggregate( { $project: {id: 1, status: 1, starts: {$size: "$traffics"}, _id: 0}})

, но я не знаю, как получить условные данные там

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Попробуйте этот код. Оператор $ filter доступен в версии Mongodb 3.2.

db.inventory.aggregate( [ 
    { $project: {id: 1, status: 1, starts: {$size: "$traffics"}, 
      completes:{$size: {$filter:{input:"$traffics",as:"item",cond:{$eq:[$$item.status,"CMP"]}}}},   
      terminates:{$size: {$filter:{input:"$traffics",as:"item",cond:{$eq:[$$item.status,"TERM"]}}}},
      abandons:{$size: {$filter:{input:"$traffics",as:"item",cond:{$eq:[$$item.status,""]}}}},
      _id: 0}
    } 
 ] )

Надеюсь, эта помощь

0 голосов
/ 24 января 2019

Я смог немного изменить ответ @Yones, чтобы получить количество записей на основе условий.

, поэтому вот мой запрос на это.

db.collection.aggregate({
  $project: {
    id: 1,
    name: 1,
    status: 1,
    starts: {$size: "$traffics"},
    completes: {
        $size: {
            $filter: {
            input: "$traffics",
            as: "item",
            cond: {
                $eq: [
                    "$$item.status",
                    "CMP"
                    ]
                }
            }
        }
    },
    terminates: {
        $size: {
            $filter: {
            input: "$traffics",
            as: "item",
            cond: {
                $eq: [
                    "$$item.status",
                    "TERM"
                    ]
                }
            }
        }
    },
    abandons: {
        $size: {
            $filter: {
            input: "$traffics",
            as: "item",
            cond: {
                $eq: [
                    "$$item.status",
                    ""
                    ]
                }
            }
        }
    },
    _id: 0
  }
})

Iя просто отфильтровываю записи по моим условиям, используя $ filter

И затем я вычисляю его размер, используя $ size.

Вот рабочий пример для этого ответа: https://mongoplayground.net/p/TcuLlJShclA

0 голосов
/ 23 января 2019

Я думаю, что вам может потребоваться запустить независимые агрегирующие операторы и использовать оператор $ match.

$match: {
    status: "CMP"
}

$match: {
    status: "TERM"
}

$match: {
    status: ""
}
...