Агрегация и состояние в Mongodb - PullRequest
0 голосов
/ 21 ноября 2018

Я новичок в MongoDB.У меня есть следующая коллекция: CallLeg, которая содержит данные в следующем формате

{
    "_id" : ObjectId("5bf5504a937eb609c4d020e4"),
    "startedAt" : ISODate("2018-11-21T17:50:45.909Z"),
    "endedAt" : ISODate("2018-11-21T18:02:09.909Z"),
    "cc" : "91",
    "phone" : "1234567890",
    "type" : "pstn",
    "status" : true,
    "channel" : "mF4YnGi7SM4qCeKHJ6SYunqkano2BNQQ",
    "cost" : 0,
    "duration" : 0,
    "cid" : "ABCDEFGH"

}
{
    "_id" : ObjectId("5bf5504a937eb609c4d020e5"),
    "startedAt" : ISODate("2018-11-21T17:50:10.110Z"),
    "endedAt" : ISODate("2018-11-21T18:02:10.110Z"),
    "cc" : "91",
    "phone" : "0007654321",
    "type" : "voip",
    "status" : true,
    "channel" : "mF4YnGi7SM4qCeKHJ6SYunqkano2BNQQ",
    "cost" : 0,
    "duration" : 0,
    "cid" : "ABCDEFGH"

}

Я хочу получить вывод следующим образом:

  • Если cid такой же для 'n 'объекты, он должен возвращать эти объекты.Допустим, он возвращает 2
  • Тогда, если obj1 имеет type=pstn, а obj2 имеет type=voip, он должен вернуть ответ как MIXED, если obj1_type = obj2_type = voip, он должен вернуть VOIP и аналогично дляpstn для того же cid.

Надеюсь, мне понятен мой вопрос.

1 Ответ

0 голосов
/ 21 ноября 2018

Вы можете использовать агрегацию ниже:

db.CallLeg.aggregate([
    {
        $group: {
            _id: "$cid",
            objects: { $push: "$$ROOT" }
        }
    },
    {
        $match: { objects: { $size: 2 } }
    },
    {
        $addFields: {
            answer: {
                $switch: {
                    branches: [
                        { case: { $allElementsTrue: [ 
                            { $map: { input: "$objects", as: "o", in: { $eq: [ "$$o.type", "voip" ] } } } ] } , then: "voip" },
                        { case: { $allElementsTrue: [ 
                            { $map: { input: "$objects", as: "o", in: { $eq: [ "$$o.type", "pstn" ] } } } ] } , then: "pstn" },
                    ],
                    default: "MIXED"
                }
            }
        }
    }
])

В основном вам необходимо $ group на cid, чтобы сравнить несколько документов друг с другом.Вы также можете добавить $match перед $group, если вам нужно проанализировать только один cid.Затем вы можете использовать $ size , чтобы проверить количество «одинаковых» объектов.На последнем этапе вам нужно сравнить элементы в массиве objects.Вы можете использовать $ map , чтобы получить массив логических значений, которые будут указывать, сколько у вас значений voip и pstns.Затем вам нужно $ allElementsTrue , чтобы проверить, есть ли у вас один тип для всех предметов.Все можно поместить внутри $ switch , чтобы определить последнюю ветвь по умолчанию, MIXED

...