Как получить условные поля в MongoDB

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

Я новичок в 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",
        }
    ]

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

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

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}})

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

Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
2
0
790
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

$match: {
    status: "CMP"
}

$match: {
    status: "TERM"
}

$match: {
    status: ""
}

Попробуйте этот код. Оператор $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}
    } 
 ] )

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

Привет, Йонес, спасибо. Это очень помогло, и я смог вывести свой запрос из этого. mongoplayground.net/p/TcuLlJShclA

Pankaj Jha 24.01.2019 11:01
Ответ принят как подходящий

Мне удалось немного изменить ответ @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
  }
})

Я просто фильтрую записи на основе своих условий, используя $фильтр

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

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

Другие вопросы по теме