Проекция Mongodb для получения объектов массива - PullRequest
0 голосов
/ 07 октября 2018

У меня есть документы mongodb в следующем формате:

{
"date": "04-10-2018",
"botData": [{
    "botId": "botId1",
    "date": "04-10-2018",
    "weekDay": "Thursday",
    "hourOfDayData": {
        "09": 24,
        "11": 56,
        "02": 66
    },
    "channelData": [{
            "channel": "web",
            "totalTraffic": 185,
            "totalMessagesSent": 357,
            "avgMessagesSentPerSession": 1.93,
            "averageInteractionTime": 4.34
        },
        {
            "channel": "fb",
            "totalTraffic": 32,
            "totalMessagesSent": 78,
            "avgMessagesSentPerSession": 1.93,
            "averageInteractionTime": 2.34
        }
    ]
}, {
    "botId": "botId2",
    "date": "04-10-2018",
    "weekDay": "Thursday",
    "hourOfDayData": {
        "09": 24,
        "11": 56,
        "02": 66
    },
    "channelData": [{
            "channel": "web",
            "totalTraffic": 185,
            "totalMessagesSent": 357,
            "avgMessagesSentPerSession": 1.93,
            "averageInteractionTime": 4.34
        },
        {
            "channel": "fb",
            "totalTraffic": 32,
            "totalMessagesSent": 78,
            "avgMessagesSentPerSession": 1.93,
            "averageInteractionTime": 2.34
        }
    ]
}]}  

Я хочу запросить часть документа.Я хочу запрос, который даст мне следующий результат:

{
    "botId": "botId1",
    "date": "04-10-2018",
    "weekDay": "Thursday",
    "hourOfDayData": {
        "09": 24,
        "11": 56,
        "02": 66
    },
    "channelData": [{
            "channel": "web",
            "totalTraffic": 185,
            "totalMessagesSent": 357,
            "avgMessagesSentPerSession": 1.93,
            "averageInteractionTime": 4.34
        },
        {
            "channel": "fb",
            "totalTraffic": 32,
            "totalMessagesSent": 78,
            "avgMessagesSentPerSession": 1.93,
            "averageInteractionTime": 2.34
        }
    ]
}  

Это запрос, который я использую сейчас:

db.test.find({botData:{$elemMatch:{botId:'botId1'}}},{"botData":1,_id:0})  

Для которого я получаю следующий результат:

{
"botData" : [ 
    {
        "botId" : "botId1",
        "date" : "04-10-2018",
        "weekDay" : "Thursday",
        "channelData" : [ 
            {
                "channel" : "web",
                "totalTraffic" : 185.0,
                "totalMessagesSent" : 357.0,
                "avgMessagesSentPerSession" : 1.93,
                "averageInteractionTime" : 4.34
            }, 
            {
                "channel" : "fb",
                "totalTraffic" : 32.0,
                "totalMessagesSent" : 78.0,
                "avgMessagesSentPerSession" : 1.93,
                "averageInteractionTime" : 2.34
            }
        ]
    }, 
    {
        "botId" : "botId2",
        "channelData" : [ 
            {
                "channel" : "web",
                "totalTraffic" : 185.0,
                "totalMessagesSent" : 357.0,
                "avgMessagesSentPerSession" : 1.93,
                "averageInteractionTime" : 4.34
            }, 
            {
                "channel" : "fb",
                "totalTraffic" : 32.0,
                "totalMessagesSent" : 78.0,
                "avgMessagesSentPerSession" : 1.93,
                "averageInteractionTime" : 2.34
            }
        ]
    }
]

}

Я попробовал функцию проекции mongodb, как вы можете видеть.Но это не сработало, как я хотел.

Может кто-нибудь найти подходящий запрос, чтобы получить желаемый результат?

1 Ответ

0 голосов
/ 07 октября 2018

Вы можете попробовать ниже агрегации

db.collection.aggregate([
  { "$match": { "botData.botId": "botId1" }},
  { "$addFields": {
    "botData": {
      "$filter": {
        "input": "$botData",
        "cond": { "$eq": ["$$this.botId", "botId1"] }
      }
    }
  }},
  { "$unwind": "$botData" },
  { "$replaceRoot": { "newRoot": "$botData" }}
])

Или

db.collection.aggregate([
  { "$match": { "botData.botId": "botId1" }},
  { "$unwind": "$botData" },
  { "$match": { "botData.botId": "botId1" }},
  { "$replaceRoot": { "newRoot": "$botData" }}
])
...